# Druid 配置參數及常見報錯

MarlonBrando1998 2022-01-08 04:57:04 阅读数:766

druid 配置

Druid 配置參數及常見報錯

  • Druid是Java語言中最好的數據庫連接池。Druid能够提供强大的監控和擴展功能。
依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
注解方式配置數據源
參數 默認值 參數作用
name 標識數據源名稱
url 數據庫鏈接 url
username 數據庫用戶名
password 數據庫密碼
driverClassName 根據url自動識別 這一項可配可不配,如果不配置druid會根據url自動識別dbType
initialSize
maxActive
maxIdle 8 已經不再使用,配置了也沒效果
maxWait 獲取連接時最大等待時間,單比特毫秒
poolPreparedStatements false 是否緩存preparedStatement,即PSCache
maxOpenPreparedStatements -1 要啟用PSCache,必須配置大於0,當大於0時,poolPreparedStatements自動觸發修改為true。
validationQuery 用來檢測連接是否有效的sql 例如:select 1
testOnBorrow true 申請連接時執行validationQuery檢測連接是否有效
testOnReturn false 歸還連接時執行validationQuery檢測連接是否有效
testWhileIdle false 建議配置為true,不影響性能,並且保證安全性。申請連接的時候檢測,如果空閑時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
minEvictableIdleTimeMillis 一個連接在池中最小生存的時間
maxEvictableIdleTimeMillis 一個連接在池中最大生存的時間
timeBetweenEvictionRunsMillis 1) Destroy線程會檢測連接的間隔時間,如果連接空閑時間大於等於minEvictableIdleTimeMillis則關閉物理連接。2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
數據庫 wait_timeout 較短導致出錯
  • 程序報錯描述如下:模擬wait_timeout設置為2分鐘。
java.sql.SQLException: Could not retrieve transation read-only status server
The last packet successfully received from the server was 3,004 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
### Error updating database. Cause: java.sql.SQLException: Could not retrieve transation read-only status server

mysql設置的一個connection的空閑時間,超過這個時間,mysql就會主動斷了這個connection,而連接池並不知道該connection已經失效,如果這時有Client請求connection,那麼會報錯。

  • 查看數據庫的 wait_timeout時間:SHOW GLOBAL VARIABLES LIKE '%timeout%';數據庫默認的這個時間是28800分鐘。
    在這裏插入圖片描述
配置信息
spring:
datasource:
# 數據源基本配置
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/duid
type: com.alibaba.druid.pool.DruidDataSource
# 數據源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
# 超時等待連接時間
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
# 最小可空閑時間
minEvictableIdleTimeMillis: 300000
# 檢測連接是否存活
validationQuery: SELECT 1 FROM DUAL
# 當true 時候 執行 上面的 select 1,開啟保活檢測
testWhileIdle: true
# 申請連接的時候檢測
testOnBorrow: false
# 歸還連接時候檢測
testOnReturn: false
poolPreparedStatements: true
# 配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
filters: stat,wall
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
常見錯誤
  • 上面的數據庫wait_timeout錯誤問題。
  • 連接失效問題,可以配置數據庫連接池檢測、回收時間等看上面的配置信息。連接失效後,例如使用Mybatis框架的時候,會報參數為空,空指針問題,還有ConnectionClosed 問題,其實就是因為連接已經失效的問題。
  • 排查完上面的可能問題之後,出現下面的問題:空閑連接,被Mysql服務端拒絕連接。可以嘗試修改connect_timeout時長。
### ERROR c.a.druid.pool.DruidPooledStatement - CommunicationsException, druid version 1.2.5,
jdbcUrl : jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai,
testWhileIdle true,
idle millis 1699995,
minIdle 1, poolingCount 1,
timeBetweenEvictionRunsMillis 600000,
lastValidIdleMillis 1699995, driver com.mysql.cj.jdbc.Driver,
exceptionSorter com.alibaba.druid.pool.vendor.MySqlExceptionSorter
### ERROR com.alibaba.druid.pool.DruidDataSource - discard connection
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
  • 如果還出現問題,那麼就無能為力了。
版权声明:本文为[MarlonBrando1998]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201080457040115.html