通过 JPA TransactionTemplate 执行长 运行 查询时连接关闭
Connection getting closed while executing long run query through JPA TransactionTemplate
我正在使用数据库连接池的自定义数据源(apache DBCP2 和 MySQL 数据库版本 8)进行连接池,并尝试使用 [=26= 删除数据库对象(100k+ 并花费超过 30 分钟) ] 交易模板。但是在 15 minutes.How 之后得到这个 error 来修复这个错误?我是否遗漏了任何其他配置?
以下是传递给创建连接的值。我已将 MinEvictableIdleTimeMillis
值设置为 45 分钟。
final BasicDataSource ds = new BasicDataSource();
ds.setPassword(password);
ds.setInitialSize(10);
ds.setMaxTotal(100);
ds.setMaxWaitMillis(20000);
ds.setMinIdle(5);
ds.setMaxIdle(20);
ds.setTimeBetweenEvictionRunsMillis(60000);
ds.setMinEvictableIdleTimeMillis(2400000L);
ds.setRemoveAbandonedOnMaintenance(true);
ds.setRemoveAbandonedTimeout(420);
ds.setTestWhileIdle(true);
ds.setTestOnBorrow(true);
ds.setTestOnReturn(true);
ds.setRemoveAbandonedOnBorrow(true);
ds.setValidationQuery("SELECT 1");
ds.setLogExpiredConnections(false);
ds.setDefaultQueryTimeout(2700);
下面是试图执行的代码:
transactionTemplate.setTimeout(3000);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus
transactionStatus) {
final AnalysisJob analysisJob = ajRepo.findById(jobId).orElse(null);
if(analysisJob != null){
final AnalysisProfileLog profileLog = analysisJob.getProfileLog();
ruleViolationRepo.deleteByJob(analysisJob);
ruleLogRepo.deleteByJobId(analysisJob.getId());
if(profileLog != null){
if(profileLog.getAnalysisType() == AnalysisType.RISK) {
riskViolationRepo.deleteByJob(analysisJob);
riskLogRepo.deleteByJobId(jobId);
}
analysisProfileLogRepository.deleteById(profileLog.getId());
ajRepo.deleteById(jobId);
}
}
jdRepo.deleteJob(jobId);
}
});
尝试增加 removeAbandonedTimeout 值,目前设置为 420 秒(7 分钟)。将此值增加 30 分钟以上(以秒为单位)。如果连接未使用的时间超过 removeAbandonedTimeout,则该连接被视为已放弃并符合删除条件。
我正在使用数据库连接池的自定义数据源(apache DBCP2 和 MySQL 数据库版本 8)进行连接池,并尝试使用 [=26= 删除数据库对象(100k+ 并花费超过 30 分钟) ] 交易模板。但是在 15 minutes.How 之后得到这个 error 来修复这个错误?我是否遗漏了任何其他配置?
以下是传递给创建连接的值。我已将 MinEvictableIdleTimeMillis
值设置为 45 分钟。
final BasicDataSource ds = new BasicDataSource();
ds.setPassword(password);
ds.setInitialSize(10);
ds.setMaxTotal(100);
ds.setMaxWaitMillis(20000);
ds.setMinIdle(5);
ds.setMaxIdle(20);
ds.setTimeBetweenEvictionRunsMillis(60000);
ds.setMinEvictableIdleTimeMillis(2400000L);
ds.setRemoveAbandonedOnMaintenance(true);
ds.setRemoveAbandonedTimeout(420);
ds.setTestWhileIdle(true);
ds.setTestOnBorrow(true);
ds.setTestOnReturn(true);
ds.setRemoveAbandonedOnBorrow(true);
ds.setValidationQuery("SELECT 1");
ds.setLogExpiredConnections(false);
ds.setDefaultQueryTimeout(2700);
下面是试图执行的代码:
transactionTemplate.setTimeout(3000);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus
transactionStatus) {
final AnalysisJob analysisJob = ajRepo.findById(jobId).orElse(null);
if(analysisJob != null){
final AnalysisProfileLog profileLog = analysisJob.getProfileLog();
ruleViolationRepo.deleteByJob(analysisJob);
ruleLogRepo.deleteByJobId(analysisJob.getId());
if(profileLog != null){
if(profileLog.getAnalysisType() == AnalysisType.RISK) {
riskViolationRepo.deleteByJob(analysisJob);
riskLogRepo.deleteByJobId(jobId);
}
analysisProfileLogRepository.deleteById(profileLog.getId());
ajRepo.deleteById(jobId);
}
}
jdRepo.deleteJob(jobId);
}
});
尝试增加 removeAbandonedTimeout 值,目前设置为 420 秒(7 分钟)。将此值增加 30 分钟以上(以秒为单位)。如果连接未使用的时间超过 removeAbandonedTimeout,则该连接被视为已放弃并符合删除条件。