The last packet successfully received from the server was 8 milliseconds ago.


轉載:https://blog.csdn.net/yaheng100/article/details/87875474

最近接手了一個SpringBoot+Mybatis+Mysql的JAVA爬蟲項目,在爬取並解析完數據之后准備存入數據庫時遇到了一個以前沒有見過的報錯,網上方案眾多且不一定有效。記錄一下自己解決這個BUG的爬坑過程。

報錯信息:

org.springframework.dao.RecoverableDataAccessException:
### Error querying database. Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet successfully received from the server was 8 milliseconds ago. The last packet sent successfully to the server was 6 milliseconds ago.
### The error may exist in com/myc/dao/CarModelMapper.java (best guess)
### The error may involve com.myc.dao.CarModelMapper.existsWithPrimaryKey-Inline
### The error occurred while setting parameters
### SQL: SELECT CASE WHEN COUNT(car_model_id) > 0 THEN 1 ELSE 0 END AS result FROM car_model_all WHERE car_model_id = ?
### Cause: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet successfully received from the server was 8 milliseconds ago. The last packet sent successfully to the server was 6 milliseconds ago.
; ]; Communications link failure

The last packet successfully received from the server was 8 milliseconds ago. The last packet sent successfully to the server was 6 milliseconds ago.; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
由於此報錯只在服務器數據庫出現,本地mysql並沒有此問題,版本均是5.7。 嘗試重啟服務器端mysql以及重啟服務器均無效,於是開始上網搜索解決方案.

方案1:在jdbc-url后添加 &autoReconnect=true,使用后無效,查的該方案只適用於Mysql4之前的版本有效

方案2:將mysql回收空閑連接的時間變長,mysql默認回收時間是8小時,可以在mysql目錄下的my.ini中增加下面配置,將時間改為1天。單位是秒,最大好像是24天。 此配置會拖累數據庫,隨棄用該方案。

方案3:配置druid鏈接池,使用 validation-query test-on-borrow: true test-while-idle: true 三種屬性,每次獲取數據庫連接時判斷該連接是否可用。具體鏈接池配置參考如下表

上表中此句描述:validationQuery 用來檢測連接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。所以validationQuery中的校驗語句一定要正確

每種數據庫都有各自的驗證語句,下表中收集了幾種常見數據庫的validationQuery。
hsqldb select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
Oracle select 1 from dual
DB2 select 1 from sysibm.sysdummy1
MySql select 1
SqlServer select1
postgresql select version()
ingres select 1
derby values 1
H2 select 1
原文:https://blog.csdn.net/qq_33101675/article/details/86504604
1
2
3
4
5
6
7
8
9
10
11
使用的是mysql,所以最終鏈接池配置如下

datasource:
druid:
url: jdbc:mysql://*****:3306/apple?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username:
password:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initial-size: 1
max-active: 10
min-idle: 1
max-wait: 30000
validation-query: select 1
time-between-connect-error-millis: 60000
min-evictable-idle-time-millis: 300000
test-on-borrow: true
test-while-idle: true
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
配置完成之后再次運行還是報錯,開始嘗試檢查數據庫配置,使用show global variables like '%timeout%';,檢查數據庫超時時間配置。


發現數據庫等待超時時間是28800s,而鏈接池 max-wait: 30000,所以導致項目判定該鏈接可用,而mysql判定該連接不可用導致連接失敗。將 max-wait設置為小於28800以后,報錯消失。項目運行成功。

總結:數據庫配置一般不會輕易出錯,所以不要輕易更改數據庫配置。解決問題就從鏈接池配置嘗試入手,使用validationQuery可能會降低性能,但數據量和使用場景對性能沒有過高要求的情況下,使用此方案還是可行的
————————————————
版權聲明:本文為CSDN博主「一筒君」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yaheng100/java/article/details/87875474


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM