似乎我的服务有数据库连接泄漏。昨天重新部署后我提到有27个已打开的连接到postgres数据库。今天早上他们已经60岁了。
对我的数据库执行此查询我发现某些连接的最后使用时间仅在昨天。
SELECT * FROM pg_stat_activity
ORDER BY state_change DESC
似乎我的jdbcTemplate应该关闭它们但它没有这样做。
这是我的配置
@Configuration
public class DatabaseConfiguration {
// reading data from application properties
// ........
private DataSource configureDataSource(String url, String user, String password, String driverClassName){
DataSource ds = DataSourceBuilder.create()
.url(url)
.username(user)
.password(password)
.driverClassName(driverClassName)
.build();
org.apache.tomcat.jdbc.pool.DataSource configuredDataSource = (org.apache.tomcat.jdbc.pool.DataSource) ds;
configuredDataSource.setTestWhileIdle(connectionTestWhileIdle);
configuredDataSource.setValidationQuery( connectionValidationQuery);
configuredDataSource.setTimeBetweenEvictionRunsMillis(
toIntExact(connectionTimeBetweenEvictionRunsMillis));
return configuredDataSource;
}
@Bean(name = "qaDataSource")
public JdbcTemplate getQaJdbcTemplate() {
DataSource ds = configureDataSource(qaURL, qaUsername, qaPassword ,qaDriverClassName);
return new JdbcTemplate(ds);
}
任何想法我的配置有什么问题?或者这可能是数据库配置错误。
答案 0 :(得分:0)
经过数小时的调查后,似乎此连接泄漏是由我们群集中的http请求超时和其他网络问题引起的。
如果发送了对postgres数据库表单的请求,并且发送了一些网络问题,则连接仍然有效。一段时间后,达到最大活动连接数,服务无法再连接到数据库。
作为一种解决方法,虽然找不到网络问题的根源,但为了避免在一段时间的工作后停止服务,我在RemoveAbandoned
方法中配置了configureDataSource
验证
configuredDataSource.getPoolProperties().setRemoveAbandonedTimeout(300);
configuredDataSource.getPoolProperties().setRemoveAbandoned(true);
这将检查活动状态下的连接是否超过5分钟,如果确实连接将被视为已放弃并将被关闭。不要忘记确保RemoveAbandonedTimeout
应该超过服务中任何sql查询的最长执行时间。