java - 通过 JPA TransactionTemplate 执行长期运行查询时连接关闭

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

我正在使用 DB 连接池的自定义数据源(apache DBCP2 和 MySQL 数据库版本 8)进行连接池,并尝试使用 Spring TransactionTemplate 删除 DB 对象(超过 100k,需要 30 分钟以上)。但是得到这个error 15 分钟后。如何修复此错误?我错过了任何其他配置吗?

下面是创建连接时传递的值。我已将 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,则该连接将被视为已放弃并有资格删除。

关于java - 通过 JPA TransactionTemplate 执行长期运行查询时连接关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56818398/

相关文章:

java - 上传大文件时出错: EXC E:java. io.IOException:发布的内容长度12000169超出了1048576的限制

java - 如何在 CXF 中使用转换删除入站 XML 元素?

php - MySQL如何统计枚举数据

php - 具有不同用户名的两台服务器之间的故障转移 MYSQL 同步

mysql - Google Cloud SQL 信息架构非常慢

Java - 合并 Hibernate beans/entities - 在 saveOrUpdate 之前

hibernate validator : EmbeddedId constraint ignored by hbm2ddl

java - 电话键盘字符串转数字

java - 有关 BlackBerry BrowserField2 的问题

java - Hibernate 实体更新现有行而不是使用 saveAndFlush 创建新行