MyBatis多數(shù)據(jù)源配置中為什么會出現(xiàn)連接關閉錯誤?如何解決?

在使用mybatis配置多數(shù)據(jù)源時,可能會遇到”no operations allowed after connection closed.”的錯誤。之前在單數(shù)據(jù)源環(huán)境下沒有遇到過這樣的問題,并且也沒有配置過類似的參數(shù),例如test-while-idle=true。以下是詳細的問題描述和解決方案。

在單數(shù)據(jù)源環(huán)境下,配置如下:

# 省略配置圖示

但在切換到多數(shù)據(jù)源環(huán)境后,出現(xiàn)了”No operations allowed after connection closed.”的錯誤,配置如下:

# 省略配置圖示

網(wǎng)上搜索后,建議添加以下MyBatis相關的配置:

# 省略配置圖示

那么,添加這些配置就能解決問題嗎?為什么在單數(shù)據(jù)源環(huán)境下不需要這些配置呢?

是的,添加上述配置通常能解決這個問題,特別是這些關鍵參數(shù):

spring.datasource.primary.test-while-idle=true spring.datasource.primary.time-between-eviction-runs-millis=18000

對于每個數(shù)據(jù)源都需要類似配置:

# 主數(shù)據(jù)源 spring.datasource.primary.test-while-idle=true spring.datasource.primary.validation-query=select 1 <h1>測試數(shù)據(jù)源</h1><p>spring.datasource.test1.test-while-idle=true spring.datasource.test1.validation-query=SELECT 1

配置說明

  1. test-while-idle=true

    • 關鍵配置,讓連接池定期檢查空閑連接是否有效。
    • 避免使用已關閉的連接。
  2. validation-query

    • 用于測試連接是否有效的sql
    • 通常使用輕量級查詢如”SELECT 1″。
  3. time-between-eviction-runs-millis

    • 空閑連接檢查的時間間隔。
    • 18000毫秒(18秒)是個合理值。
  4. min-idlemax-idle

    • 控制連接池中保持的最小和最大空閑連接數(shù)。

為什么需要這些配置

多數(shù)據(jù)源環(huán)境下,某些數(shù)據(jù)源可能較少使用,導致連接長時間空閑。數(shù)據(jù)庫服務器通常會關閉長時間空閑的連接(如mysql默認8小時)。如果應用嘗試使用這些已關閉的連接,就會出現(xiàn)”No operations allowed after connection closed”錯誤。

通過啟用test-while-idle和設置validation-query,連接池會定期驗證連接是否有效,及時關閉無效連接并創(chuàng)建新連接,從而避免使用已關閉的連接。

MyBatis多數(shù)據(jù)源配置中為什么會出現(xiàn)連接關閉錯誤?如何解決?

? 版權聲明
THE END
喜歡就支持一下吧
點贊8 分享