给定maxPoolSize
20个和8个部署,您应该最多可以看到180个连接,如果应用程序已经看到流量已经消退,则可能处于非活动状态.您没有配置任何内容来鼓励快速缩减池 - 设置maxIdleTime和/或maxIdleTimeExcessConnections和/或maxConnectionAge.
您应该告诉Spring如何关闭您定义的DataSource.在您的方法上使用@Bean(destroyMethodName="close")
而不是@Bean
单独使用dataSource()
.
您尚未配置任何类型的连接测试,因此即使损坏的连接可能仍保留在池中.请参阅连接测试的简单建议.
如果问题是连接泄漏,客户端最终将无限期挂起,因为池将不在Connections中检出,但已经到达maxPoolSize
,因此无法从DBMS获取更多内容.你是否看到客户这样挂?
在Java7之后,避免连接泄漏的方法是始终通过try-with-resources从DataSource获取Connections .也就是说,用...
try ( Connection conn = myDataSource.getConnection() ) { ... }
而不是仅仅调用getConnection()
可能抛出异常或try
块的方法.如果您使用的是旧版本的Java,则需要使用健壮的资源清理惯用法,即在try
块中获取Connection 并确保conn.close()
在finally
块中始终关闭,而不管finally块中的任何其他失败.如果您不DataSource
直接使用,但让Spring实用程序使用它,希望这些实用程序正在做正确的事情.但是你应该发布你收到的任何警告警告你潜在的连接泄漏!
如果您的应用程序在"预热"后很少使用Connections,并且您希望最小化资源占用,请设置minPoolSize
为非常低的数字,并使用上述maxIdleTime和/或maxIdleTimeExcessConnections和/或maxConnectionAge来确保池当连接不再需要时,立即缩小规模.或者close()
,当您完成其工作时,您可能是DataSource,但您可能将其留给Spring.