DataSource 连接没有被释放
DataSource connections not getting released
我正在使用 DataSource 和 DataSourceTransactionManager spring bean 并将它们连接到 JobRepository bean 中。一旦我的 spring 应用程序关闭,其中之一不应该是生命周期感知的或具有关闭连接的关闭功能。我的进程挂起,除非我在退出前手动调用 DataSourceUtils.releaseConnection(...) 。我在这里错过了什么吗?我的代码中是否还有其他错误会导致此问题?
我需要使用连接池吗?如何让 spring 正确管理连接生命周期。
@Bean
public DataSource dataSource(@Value("${batch_db.url}") String dataSourceUrl, AWSCredentials awsCredentials) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl(dataSourceUrl);
dataSource.setUsername(awsCredentials.getAWSAccessKeyId());
dataSource.setPassword(awsCredentials.getAWSSecretKey());
return dataSource;
}
@Bean
@DependsOn(value = "dataSource")
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
@Bean
@DependsOn(value = "dataSource")
public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception {
JobRepositoryFactoryBean jobRepository = new JobRepositoryFactoryBean();
jobRepository.setDataSource(dataSource);
jobRepository.setTransactionManager(transactionManager);
return jobRepository.getJobRepository();
}
根据 DriverManagerDataSource
(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html) 的 javadoc,每次从它建立连接时,class 都会盲目地创建一个新连接。从那里开始,没有额外的连接管理,因此由您来管理它们。如果您想让其他人管理连接,则需要使用适当的连接池。
我正在使用 DataSource 和 DataSourceTransactionManager spring bean 并将它们连接到 JobRepository bean 中。一旦我的 spring 应用程序关闭,其中之一不应该是生命周期感知的或具有关闭连接的关闭功能。我的进程挂起,除非我在退出前手动调用 DataSourceUtils.releaseConnection(...) 。我在这里错过了什么吗?我的代码中是否还有其他错误会导致此问题?
我需要使用连接池吗?如何让 spring 正确管理连接生命周期。
@Bean
public DataSource dataSource(@Value("${batch_db.url}") String dataSourceUrl, AWSCredentials awsCredentials) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl(dataSourceUrl);
dataSource.setUsername(awsCredentials.getAWSAccessKeyId());
dataSource.setPassword(awsCredentials.getAWSSecretKey());
return dataSource;
}
@Bean
@DependsOn(value = "dataSource")
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
@Bean
@DependsOn(value = "dataSource")
public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception {
JobRepositoryFactoryBean jobRepository = new JobRepositoryFactoryBean();
jobRepository.setDataSource(dataSource);
jobRepository.setTransactionManager(transactionManager);
return jobRepository.getJobRepository();
}
根据 DriverManagerDataSource
(http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html) 的 javadoc,每次从它建立连接时,class 都会盲目地创建一个新连接。从那里开始,没有额外的连接管理,因此由您来管理它们。如果您想让其他人管理连接,则需要使用适当的连接池。