目录
场景
在优化批量导入接口过程中,我采用了多线程事务的方式进行修改,然后测试时报以下错误:
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30010ms.
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:309)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.startTransaction(AbstractPlatformTransactionManager.java:400)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
at com.boc.ljh.controller.CheckController.lambda$importExcel$0(CheckController.java:741)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run$$$capture(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30010ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:696)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:265)
分析
将错误信息翻译过来大概意思就是:无法为事务创建JDBC连接,HikariPool-1连接不可用,因为Hikari的默认连接数为10,我在批量导入时请求量太高导致数据库连接数不够,所以才导致该问题出现。
解决
在yml配置文件中设置Hikari的连接数,该连接数根据自己情况设定,切记不要设定太大,否则会导致其它工具(比如Navicat)无法连接数据库。
spring
datasource
hikari:
maximum-pool-size: 100
扩展
在Hikari数据库连接池中还可以对以下参数进行配置:
- minimum-idle:池中最小空闲连接数量。默认值10,小于池中最大连接数,一般根据系统大部分情况下的数据库连接情况取一个平均值。
- pool-name:连接池的名字。一般会出现在日志和JMX控制台中。默认值:auto-genenrated。
- auto-commit:是否自动提交池中返回的连接。默认值为true。一般是有必要自动提交上一个连接中的事物的。如果为false,那么就需要应用层手动提交事物。
- idle-timeout:空闲时间。仅在minimum-idle小于maximum-poop-size的时候才会起作用。默认值10分钟。根据应用实际情况做调整。
- max-lifetime:连接池中连接的最大生命周期。当连接一致处于闲置状态时,数据库可能会主动断开连接。
- connection-timeout:连接超时时间。默认值为30s,可以接收的最小超时时间为250ms。