1

我将 Spring Boot 与 Oracle 和 Tomcat 数据库池一起使用。我遇到了连接需要很长时间才能返回池的问题。我有一个 500 的最大活动,这非常大,仅用于测试目的,我正在使用 JMeter 运行一些负载测试。测试执行后,我查看数据源池指标,它看起来像这样:

  "datasource.myDataSource.active": 120,
  "datasource.myDataSource.usage": 0.24

此时,没有更多的数据库活动发生。但是,如果我在大约 5 分钟后查看,我仍然有完全相同数量的活动连接,所以如果我运行另一个测试,活动连接的数量将翻倍。如果我将其放置 10-15 分钟左右,最终连接将返回到池中。但是,这意味着如果有很多人同时使用该应用程序,我们很快就会耗尽连接,并且由于它们很长时间没有返回到池中,所以我们最终会超时。

这是我的数据源配置:

 @Bean(name = "myDataSource")
    @ConfigurationProperties(prefix = "datasource.myDataSource")
    public DataSource userStoreDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "myDataSourceEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean myDataSourceEntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("myDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.mypackage..model.entity")
                .persistenceUnit("someStuff")
                .build();
    }

    @Bean(name = "myDataSourceTransactionManager")
    public PlatformTransactionManager myDataSourceTransactionManager(
            @Qualifier("myDataSourceEntityManagerFactory") EntityManagerFactory
                    myDataSourceManagerFactory) {
        return new JpaTransactionManager(myDataSourceEntityManagerFactory);
    }

'datasource.myDataSource.driver-class-name','oracle.jdbc.OracleDriver'
'datasource.myDataSource.maxActive','500'
'datasource.myDataSource.removeAbandoned','true'
'datasource.myDataSource.removeAbandonedTimeout','500'
'datasource.myDataSource.test-on-borrow','true'
'datasource.myDataSource.test-while-idle','true'
'datasource.myDataSource.validation-query','SELECT 1 FROM DUAL'

我错过了一些关键配置吗?我会认为一旦 Spring 完成连接就应该返回连接。

4

2 回答 2

2

我使用了一个小的 removeAbandonedTimeout 值和一个 logAbandoned = true 的组合来调试这个问题,并发现它来自某人最近添加的一些运行纯 JDBC 查询而不关闭连接的代码。logAbandoned 向我展示了堆栈跟踪,这导致我找到了有问题的代码。

于 2018-01-22T23:06:18.450 回答
1

对于遇到相同问题的下一个人:

将 removeAbandonedTimeout 调整为非常小的值(@cloudwalker 使用了 10 秒),看看行为是否有所改善。

于 2018-01-22T22:51:17.210 回答