关于线程池引发的问题

    程序运行一段时间后就会不响应

    使用的是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状态的连接,但这是其他服务创建的...

https://blog.csdn.net/w20810/article/details/81606407