mybatis多資料來源踩坑,資料庫連線經常斷開問題

2021-09-27 05:28:53 字數 3534 閱讀 5340

最近某專案上出現乙個奇怪的問題,就是資料庫經常隔幾小時就報連線已關閉

即使是加了如下配置也依然不行,網上也沒找到什麼文章解釋這個坑

test-on-borrow: true

test-while-idle: true

validation-query: select 1 from dual

網上查不到,那就只能自己推敲猜測了。因為是mybatis多資料來源的配置,所以每個db我都有專門寫乙個config作為連線配置。

果斷跟進build()方法

public datasource build()
打個斷點可以看到此時返回的result的是乙個全新的datasource

所以我們可以通過修改dbdatasource()方法,寫入我們的配置引數:

@value("$")

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() 

通過上面方法確實可以解決問題了,但是我突然想到,預設建立的datasource是沒有url,username,password等必要的基礎資訊的。那這幾個配置引數是為什麼又可以寫入進去呢?

這個時候我看到了我們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:

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 ioc注入的時候,讀的到的tomcat.max-wait並不能匹配到datasource裡的setmaxwait方法。自然就不起作用了。

所以這個問題只需要將配置檔案改為如下即可

spring:

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:

***....

這個問題從結果上來看,那真是簡單的不行,但是從過程上來說,不僅讓我又複習了一遍spring ioc的流程,也讓我感覺到這種一步一步解剖問題,把多個知識點連線起來的成就感。如果之前沒有學習spring的原始碼,我這次大概率也不會想到去看bean的注入吧

配置mybatis多資料來源

先說一下業務需求,專案中需要兩個資料來源分別連線不同的資料庫,每個dao層只會用到其中乙個資料來源。在dao層想用哪個資料來源直接在注入的時候注入對應的資料來源即可。resource name centersqlsessionfactory public void setsqlsessioinfac...

mybatis多資料來源配置

最近改造老專案需要使用兩個資料庫,故而總結了一下mybatis的雙資料來源配置,學過mybatis的都知道mybatis其實就是封裝了jdbc的框架,使用mybatis繞不開sqlsessionfactory的配置,那配置多個資料來源的核心也是在於配置多個session工廠,用不同的工廠去操作不同的...

Spring 整合多資料來源的mybatis

其實乙個工程多資料來源比較常見。比如我們將所有工程中使用到的定時任務都持久化到同乙個資料庫,或者我們為工作流框架單獨提供乙個資料來源。其實這些都好說,畢竟這些情況都是框架替我們做一些工作,我們幾乎沒有必要去訪問這些資料 或者框架已經提供了方便的api去訪問持久化資料,我們不用去考慮這方面的事情。比較...