持久化用的 Hibernate,连接池用的 Hikari,连接池大小设置为 800 。场景是使用 csv 批量导入上万条记录,每条记录不是简单的保存到数据库,可能会涉及到多次数据库查询或者更新操作。
在这种前提之下,当我将这些动作都放到一个事务中去处理的时候,后台会报如下的错误:
Caused by: java.sql.SQLTransientConnectionException: HikariPool-3 - Connection is not available, request timed out after 20001ms.
21:37:18,591 ERROR [stderr] (default task-3) at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:695)
21:37:18,591 ERROR [stderr] (default task-3) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197)
21:37:18,591 ERROR [stderr] (default task-3) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162)
21:37:18,591 ERROR [stderr] (default task-3) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:100)
21:37:18,592 ERROR [stderr] (default task-3) at org.hibernate.hikaricp.internal.HikariCPConnectionProvider.getConnection(HikariCPConnectionProvider.java:77)
21:37:18,592 ERROR [stderr] (default task-3) at org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider.getConnection(AbstractMultiTenantConnectionProvider.java:36)
使用 show processlist 观察 mysql 连接的时候,某个瞬间会产生大量的 sleep 连接。
现在我的疑问是,sleep 连接是怎么才会产生的? 如果我仅仅只是在循环中执行一万次数据库查询操作,MySQL 连接没有什么波动,而当我在使用事务执行某个耗时任务时(这个任务中会执行查询数据库的操作),就会产生大量的 sleep 连接?
谁能帮忙解释一下?