問題描述:
使用springboot連接數據庫,啟動的時候報錯:testWhileIdle is true, validationQuery not set。但是不影響系統使用,數據庫等一切訪問正常。
application.properties數據源配置如下:
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.initial-size=1
spring.datasource.maximum-pool-size=10
spring.datasource.connection-timeout=5000
問題分析:
查了這句話的意思:空閑的時候進行檢測是開啟的,但是檢測的查詢語句沒有設置。大致意思就是說,當數據庫沒有接收到請求時,會進行數據庫連接檢測,檢查數據庫是否還是連着的。檢查數據庫是否斷開需要發送sql語句。報錯是說這個sql語句沒有設置。
那么解決思路有兩個:
1、設置不進行空閑時連接檢測。
2、開啟空閑時連接檢測,並設置檢測用的sql語句。
先查了資料,說testWhileIdle默認是false的,這是竟然是true,整個代碼搜索了一下,也沒有見到設置testWhileIdle的地方,推測應該是版本不一樣,新版本jar包里面默認設置為true。
好吧,先不管這些,既然都是數據庫的設置,那么應該可以在配置數據源的時候加上這些配置,網上搜索了配置的寫法,如下:
spring.datasource.test-while-idle=true
spring.datasource.validation-query=SELECT 1
但是發現還是不起作用,仍然報錯。
有些不可理解,同樣是數據源的配置,為什么上面的連接url、用戶名、密碼可以生效,下面的就不生效呢?
再次搜索答案,發現有介紹了:
springboot1.4取消spring.datasource.type
在新版本中,validationQuery沒有自動注入,那么就需要手動聲明datasource bean。至於怎么寫,可以看上面的文章。
主要是手動注入DruidDataSource,聲明一個配置類,數據源各個值都注入進去,返回DruidDataSource。
再啟動,系統不報錯了!
最后查看了DruidDataSource源代碼,

public static final String DEFAULT_VALIDATION_QUERY = null;
果然,DruidDataSource默認testWhileIdle=true,並且validationQuery設置為空。
總結:
1、首先要理解錯誤,明白錯誤的意思。
2、從錯誤出發,分析導致錯誤的原因,針對這些能找到哪些解決方法。
3、再搜索資料,網上的資料都太亂了,版本不一致、環境不一樣等有很多影響因素,需要一一進行實驗。
4、看源代碼也是很不錯的解決問題辦法。
