程序运行一段时间后就会不响应
使用的是springboot2.0项目+postgresql 10,配置文件中没有做任何关于数据库连接池的配置。
错误日志:Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
跟Sql语句无关,所有关于数据库的请求都报这个异常。
尝试的解决方案:
1 查看数据库剩余连接:select max_conn-now_conn as resi_conn from (select setting::int8 as max_conn,(select count(*) from pg_stat_activity) as now_conn from pg_settings where name = 'max_connections') t; 剩余连接为410。
2 查看所有连接的状态:select datname,pid,application_name,state from pg_stat_activity;发现有好几个idle状态的数据库连接;然后还有9个idle in transactional的数据库连接,而且发现这9个数据库连接一直都是idle in transactional状态,项目创建的数据库连接总共也就14个。
3 使用arthas发现有9个Bokcked线程,查看这些线程的堆栈信息,发现这些线程都是在开启事务的情况下被阻塞了。
猜测原因:长时间持有idle in transactional状态的数据库连接,会不会影响获取数据库连接。
问题重现:
只需要调用10次接口,后面的请求就获取不要数据库连接了。
但我很好奇长时间idle in transactioanl状态的数据库连接,为啥会导致获取不到数据库连接!
===================================================
好吧,最后找到原因了,还是是因为 HikariPool创建的连接被用完了,它默认最多会创建10个连接。
主要是被我第二个操作给误导了,查看数据库连接的状态,是有好几个idle状态的连接,但这是其他服务创建的...