jdbcTemplate连接泄漏到Spring Boot中的postgresql db

时间:2018-05-16 06:37:09

标签: postgresql spring-boot connection-leaks

似乎我的服务有数据库连接泄漏。昨天重新部署后我提到有27个已打开的连接到postgres数据库。今天早上他们已经60岁了。

对我的数据库执行此查询我发现某些连接的最后使用时间仅在昨天。

SELECT * FROM pg_stat_activity
ORDER BY state_change DESC

enter image description here

似乎我的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);
    }

任何想法我的配置有什么问题?或者这可能是数据库配置错误。

1 个答案:

答案 0 :(得分:0)

经过数小时的调查后,似乎此连接泄漏是由我们群集中的http请求超时和其他网络问题引起的。

如果发送了对postgres数据库表单的请求,并且发送了一些网络问题,则连接仍然有效。一段时间后,达到最大活动连接数,服务无法再连接到数据库。

作为一种解决方法,虽然找不到网络问题的根源,但为了避免在一段时间的工作后停止服务,我在RemoveAbandoned方法中配置了configureDataSource验证

configuredDataSource.getPoolProperties().setRemoveAbandonedTimeout(300);
configuredDataSource.getPoolProperties().setRemoveAbandoned(true);

这将检查活动状态下的连接是否超过5分钟,如果确实连接将被视为已放弃并将被关闭。不要忘记确保RemoveAbandonedTimeout应该超过服务中任何sql查询的最长执行时间。