我将 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 完成连接就应该返回连接。