Соединение закрывается при выполнении долгосрочного запроса через JPA TransactionTemplate - PullRequest
0 голосов
/ 29 июня 2019

Я использую Custom DataSource для пула соединений с БД (apache DBCP2 и база данных MySQL версии 8) для пула соединений и пытаюсь удалить объекты БД (100k + и занимает более 30 минут) с помощью Spring TransactionTemplate.Но получая эту ошибку через 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);
        }
    });

1 Ответ

0 голосов
/ 01 июля 2019

Попробуйте увеличить значение removeAbandonedTimeout, в настоящее время оно установлено на 420 секунд (7 минут). Увеличьте это значение более чем на 30 минут (в секундах). Соединение считается разорванным и может быть удалено, если оно не использовалось дольше, чем removeAbandonedTimeout.

...