通过JPA TransactionTemplate执行长期查询时连接被关闭

时间:2019-06-29 14:39:45

标签: java mysql hibernate spring-data-jpa apache-commons-dbcp

我正在为数据库连接池(Apache DBCP2和MySQL数据库版本8)使用自定义数据源进行连接池,并尝试使用Spring TransactionTemplate删除数据库对象(超过100k,耗时30分钟以上)。但是15分钟后收到此error。如何解决此错误?我还错过任何其他配置吗?

下面是传递来创建Connection的值。我已将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);
        }
    });

1 个答案:

答案 0 :(得分:0)

尝试通过增加removeAbandonedTimeout值进行尝试,当前将其设置为420秒(7分钟)。增加此值超过30分钟(以秒为单位)。如果连接的使用时间不超过removeAbandonedTimeout,则认为该连接已被删除并可以删除。