连接池资源不足
连接池资源不足
我有一个使用Java编写的Spring Boot和Hibernate的应用程序。我将其部署在一个具有多个实例的Jetty Web服务器上。如果我有太多(超过10个)实例,我会遇到以下错误:\ncom.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: FATAL: remaining connection slots are reserved for non-replication superuser connections
\n许多连接(10倍的实例)显示为空闲状态。\n附注:\npostgres 9104 0.0 0.0 248968 4392 ? Ss 08:07 0:00 postgres: user my_db 127.0.0.1(60095) idle
\n某个实例的Hikari跟踪日志:\n2017-02-21 10:59:47.578 DEBUG 7401 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Pool stats (total=10, active=0, idle=10, waiting=0)
\n设置:\nhikari.leakDetectionThreshold: 30000
\n没有记录任何有趣的内容。我认为这个链接看起来很有意思:HikariCP - connection is not available\n有任何想法如何调试这个问题?另外,我使用的是Java 7,所以是Hikari 2.4.7版本。
连接池耗尽问题的原因可能是数据库中的最大连接数设置不足以支持连接池中的连接数。解决方法可以是增加PostgreSQL配置文件中的max_connections参数,或者减少连接池中的最大连接数。如果存在连接泄漏,连接池应该拒绝创建更多的连接。问题中的错误提示表明是数据库拒绝创建更多连接,因此连接池中允许的连接数超过了数据库的最大连接数。
显然,作者的应用程序有多个实例,所以10 x instances > postgres_max_connections
。在增加PostgreSQL的最大连接数之前,我可能会考虑减少连接池的大小(或者至少保持少于10个实例处于空闲状态),除非他有一台非常强大的服务器来运行数据库。
两种方法都是可行的,这取决于应用程序实际上需要多少连接才能平稳运行。如果存在连接泄漏,无论有多少可能的连接数也是不够的。然而,问题中似乎没有连接泄漏,因为当部署超过10个实例(超过100个连接被池化)时才出现错误。我会将连接池的最小连接数设置为较低的值(例如5),将最大连接数设置为可能更大的值,具体取决于使用模式。