use*_*596 16 java spring datasource hikaricp dbcp
我有一个用于测试目的的小型 Java 应用程序。我最近搬到了hikari。我注意到的是我不断收到此错误。
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:602)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:195)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85)
Run Code Online (Sandbox Code Playgroud)
以下是我最初对 hikari 的设置。
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/****");
config.setUsername("***");
config.setPassword("*****");
config.setMaximumPoolSize(20);
Run Code Online (Sandbox Code Playgroud)
我的两个设备几乎没有使用它,我确保最后我确实关闭了它。所以我不知道为什么它不断收到错误?可能是什么问题,或者我需要更改一些设置吗?
我的 hikari 版本是 HikariCP-2.6.1.jar。
Gir*_*ore 14
由于网络延迟或某些执行时间过长(超过 30000 毫秒)的查询,您的数据库未在(默认 connectionTimeout 属性的 30000 毫秒内)获得连接。
请尽量增加财产的价值connectionTimeout
。
YML 配置示例:
spring:
datasource:
hikari:
minimumIdle: 2
maximumPoolSize: 10
idleTimeout: 120000
connectionTimeout: 300000
leakDetectionThreshold: 300000
Run Code Online (Sandbox Code Playgroud)
Java 配置示例:
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(20);
config.setConnectionTimeout(300000);
config.setConnectionTimeout(120000);
config.setLeakDetectionThreshold(300000);
Run Code Online (Sandbox Code Playgroud)
就我而言,代码没有关闭连接。
\n尝试使用资源修复了它:
\ntry (\n Connection connection = dataSource.getConnection();\n Statement statement = \xe2\x80\xa6\n) {\n\xe2\x80\xa6\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n
就我而言,我使用 JPA,因此使用 EntityManagerFactory 来持久化并查询我的 springBoot 项目,并得到相同的错误。
原因是在任何 CRUD 操作中,一旦操作完成,我就不会关闭 EntityManager,从而耗尽资源。
希望这可以帮助!!
EntityManager em = emf.createEntityManager();
Customer c = em.find(Customer.class , id);
em.close();
Run Code Online (Sandbox Code Playgroud)
小智 5
我正在使用 spring boot 并且我遇到了同样的问题,我的解决方案是获得这样的连接“ DataSourceUtils.getConnection(dataSource)
”。所以我从dataSource.getConnection()
改为DataSourceUtils.getConnection(dataSource)
。
我已经使用以下方法解决了我的问题:
增加 minIdle 和 maxPool
spring.datasource.hikari.minimumIdle=20
spring.datasource.hikari.maximumPoolSize=30
spring.datasource.hikari.connectionTimeout=50000
Run Code Online (Sandbox Code Playgroud)
要调试问题/检查值是否正常,请启用 Hikari 的日志记录:
logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
logging.level.com.zaxxer.hikari=TRACE
Run Code Online (Sandbox Code Playgroud)
日志将如下所示:
DEBUG 2023-01-06T16:12:31.932018849Z HikariPool-1 - Before cleanup stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:31.932665522Z HikariPool-1 - After cleanup stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:31.932733949Z HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:32.495269726Z HikariPool-1 - After adding stats (total=17, active=0, idle=17, waiting=0)
DEBUG 2023-01-06T16:12:38.309953158Z HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:39.200246897Z HikariPool-1 - Fill pool skipped, pool is at sufficient level.
DEBUG 2023-01-06T16:12:44.812065268Z HikariPool-1 - Before cleanup stats (total=18, active=0, idle=18, waiting=0)
DEBUG 2023-01-06T16:12:44.812822113Z HikariPool-1 - After cleanup stats (total=18, active=0, idle=18, waiting=0)
Run Code Online (Sandbox Code Playgroud)
祝你好运 !:)
警告:请小心,较大的 MaximumPoolSize 可能会产生代码异味,并可能隐藏性能问题,例如:长事务。DB供应商还建议使用较小的maximumPoolSize,例如:maximumPoolSize=10。数据库性能将受到较大的 MaximumPoolSize 值的影响。
归档时间: |
|
查看次数: |
35210 次 |
最近记录: |