最近某專案上出現乙個奇怪的問題,就是資料庫經常隔幾小時就報連線已關閉
即使是加了如下配置也依然不行,網上也沒找到什麼文章解釋這個坑
test-on-borrow: true網上查不到,那就只能自己推敲猜測了。因為是mybatis多資料來源的配置,所以每個db我都有專門寫乙個config作為連線配置。test-while-idle: true
validation-query: select 1 from dual
果斷跟進build()方法
public datasource build()打個斷點可以看到此時返回的result的是乙個全新的datasource
所以我們可以通過修改dbdatasource()方法,寫入我們的配置引數:
@value("$")通過上面方法確實可以解決問題了,但是我突然想到,預設建立的datasource是沒有url,username,password等必要的基礎資訊的。那這幾個配置引數是為什麼又可以寫入進去呢?private string url;
@value("$")
private string username;
@value("$")
private string password;
@value("$")
private boolean testonborrow;
@value("$")
private boolean testwhileidle;
@value("$")
private string validationquery;
@value("$")
private int maxidle;
@value("$")
private int minidle;
@value("$")
private int initialsize;
@value("$")
private int maxactive;
@value("$")
private int timebetweenevictionrunsmillis;
@bean(name = "db1datasource")
@configurationproperties(prefix = "spring.datasource.db1")
@primary
public datasource dbdatasource()
這個時候我看到了我們dbdatasource方法上有乙個@bean(name = "db1datasource"),於是大膽猜測我們這些配置引數的注入是第一次建立的時候通過spring的ioc注入的。通過我的debug發現事實也確實如此。
對databinder類的bind方法打斷點,
我們可以看到方法的呼叫路徑
看到了我們熟悉的refresh**,這一部分spring原始碼相關請看spring原始碼分析
此時只剩最後乙個疑惑了,我們的url,username,password等既然能通過ioc注入到datasource裡,那為什麼其他的引數不可以呢?我隨著datasource類一路往上,找到他的父類介面poolconfiguration,看到了所有的引數和getset方法。
spring:終於找到這個坑了!datasource:
db1:
url:
username:
password:
driver-class-name: oracle.jdbc.driver.oracledriver
tomcat:
max-wait: 10000
max-active: 30
test-on-borrow: true
max-idle: 5
db2:
***....
原來spring data預設使用tomcat-jdbc的連線池的時候,配置的引數是
spring:而當使用多資料來源配置的時候,簡單的以為只是複製過去即可,所以spring ioc注入的時候,讀的到的tomcat.max-wait並不能匹配到datasource裡的setmaxwait方法。自然就不起作用了。datasource:
url:
username:
password:
driver-class-name: oracle.jdbc.driver.oracledriver
tomcat:
max-wait: 10000
max-active: 30
test-on-borrow: true
max-idle: 5
所以這個問題只需要將配置檔案改為如下即可
spring:這個問題從結果上來看,那真是簡單的不行,但是從過程上來說,不僅讓我又複習了一遍spring ioc的流程,也讓我感覺到這種一步一步解剖問題,把多個知識點連線起來的成就感。如果之前沒有學習spring的原始碼,我這次大概率也不會想到去看bean的注入吧datasource:
db1:
url:
username:
password:
driver-class-name: oracle.jdbc.driver.oracledriver
max-wait: 10000
max-active: 30
test-on-borrow: true
test-while-idle: true
validation-query: select 1 from dual
max-idle: 5
db2:
***....
配置mybatis多資料來源
先說一下業務需求,專案中需要兩個資料來源分別連線不同的資料庫,每個dao層只會用到其中乙個資料來源。在dao層想用哪個資料來源直接在注入的時候注入對應的資料來源即可。resource name centersqlsessionfactory public void setsqlsessioinfac...
mybatis多資料來源配置
最近改造老專案需要使用兩個資料庫,故而總結了一下mybatis的雙資料來源配置,學過mybatis的都知道mybatis其實就是封裝了jdbc的框架,使用mybatis繞不開sqlsessionfactory的配置,那配置多個資料來源的核心也是在於配置多個session工廠,用不同的工廠去操作不同的...
Spring 整合多資料來源的mybatis
其實乙個工程多資料來源比較常見。比如我們將所有工程中使用到的定時任務都持久化到同乙個資料庫,或者我們為工作流框架單獨提供乙個資料來源。其實這些都好說,畢竟這些情況都是框架替我們做一些工作,我們幾乎沒有必要去訪問這些資料 或者框架已經提供了方便的api去訪問持久化資料,我們不用去考慮這方面的事情。比較...