springboot連接數據庫報錯testWhileIdle is true, validationQuery not set


問題描述:

  使用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、看源代碼也是很不錯的解決問題辦法。


免責聲明!

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



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