Too many connections解決過程

現象描述:

數據庫操作採用的是spring-data-jpa,測試操作數據庫的單元測試整個文件執行是成功的,但是發佈到流水線自動化編譯是報錯:

o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1040, SQLState: 08004,
o.h.engine.jdbc.spi.SqlExceptionHelper : Too many connections

解決過程:

使用show variables like “max_connections”;可以查看數據庫的最大連接數,顯示爲240,

使用show processlist可以查看數據庫當前的連接情況,顯示爲135

單元測試數量比較多,有34個,很多都用到了@SpringBootTest註解,在本地使用mvn test執行單元測試,通過show processlist實時查看數據庫連接數發現在執行單元測試的過程中,數據庫的連接數由原來的135快速增加到200,最後達到238,接近數據庫設置的最大連接數,最後執行數據庫操作的單元測試報錯,關鍵的錯誤信息爲Too many connection.

單元測試執行完之後,數據庫連接數又恢復了原來的135,說明單元測試執行完之後執行中建立的連接數都被釋放了。

猜想與單元測試比較多有關,在部分單元測試上增加@Ignore註解,取消執行,再次執行mvn test,實時查看數據庫連接發現連接數增加到200之後沒有再增加,最後的單元測試執行都成功了

原因分析:

SpringBoot數據庫連接池默認使用的是Tomcat連接池,通過查資料發現tomcat連接池啓動時創建的初始連接數量默認爲10,每次執行添加了@SpringBootTest註解的單元測試時,springboot都會去創建連接池,如果創建了15個連接池,默認就會初始化150個連接數,加上數據庫原來的連接數,就會超過Mysql數據庫默認的最大連接數,而程序正常啓動時只會創建一個連接池,所以正常使用時沒有問題的,但是單元測試中如果很多地方用到了@SpringBootTest就有可能會有問題,因爲每次SpringBoot啓動時都會去初始化連接池,由於單元測試執行時間一般都很多來不及釋放連接,就會導致執行所有單元測試時總的連接數超過了數據庫設置的最大連接數。

解決方法:

在test/resources目錄下爲單元測試文件添加application.properties,並在其中設置數據庫連接池初始化連接數爲1,最大活躍是2

spring.datasource.max-active=2
spring.datasource.initialSize=1
該配置文件只會影響單元測試,不會影響正常的程序執行。

參考資料:

Springboot默認數據庫連接池及常用屬性:https://blog.csdn.net/m0_37754003/article/details/83582263

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章