Нужна помощь в отслеживании причины JPASystemException - PullRequest
3 голосов
/ 10 июля 2020

Я запускаю приложение Spring Batch, которое вставляет несколько тысяч строк в мою Postgresql базу данных за пакет. Время от времени, без видимой причины, мы получаем следующее исключение:

org.springframework.orm.jpa.JpaSystemException: nested exception is javax.persistence.PersistenceException at ...

Нам нечего сказать , что такое , PersistenceException. Это не всегда происходит и не происходит в одном и том же месте. Я изучал распространенные причины этого исключения и перепробовал все:

  1. Я реализовал JPAVendorAdapter, который должен давать более качественные сообщения об ошибках (это не так)
  2. Я проверил, что класс репозитория был определен правильно
  3. Я запустил его локально и поставил точку останова в JPASystemException, но когда выполнение дошло до него, в трассировке стека не было ничего, чтобы указать на то, что пошло не так .

У кого-нибудь есть еще идеи? Я даже не знаю, какой код здесь показывать, потому что не знаю, откуда взялась ошибка, будь то плохая конфигурация, служба или репозиторий. Я был бы очень признателен за больше идей!

Полная трассировка стека приведена ниже:

com.company.common.exception.ERDException: org.springframework.orm.jpa.JpaSystemException: 
nested exception is javax.persistence.PersistenceException 
at com.company.ingest.delegate.BaseDelegate.insertRecords(BaseDelegate.java:537) 
at com.company.ingest..delegate.Delegate.writeResult(Delegate.java:164) 
at com.company.ingest.job.AbstractBaseJob.insertReturnsRecords(AbstractBaseJob.java:678) 
at com.company.ingest.job.PerfReturnsWriter.processData(PerfReturnsWriter.java:115) 
at com.company.ingest.job.PerfReturnsWriter.write(PerfReturnsWriter.java:83) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) 
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
at com.sun.proxy.$Proxy201.write(Unknown Source) 
at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:175) 
at org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:151) 
at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor$3.doWithRetry(FaultTolerantChunkProcessor.java:328) 
at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:287) 
at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:211) 
at org.springframework.batch.core.step.item.BatchRetryTemplate.execute(BatchRetryTemplate.java:217) 
at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor.write(FaultTolerantChunkProcessor.java:420) 
at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:199) 
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:75) 
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406) 
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330) 
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:272) 
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81) 
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:374) 
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144) 
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257) 
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200) 
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148) 
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64) 
at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67) 
at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169) 
at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) 
at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134) 
at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:306) 
at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
at java.lang.Thread.run(Thread.java:748) 

Ответы [ 2 ]

1 голос
/ 17 июля 2020

Проблема в том, что вы неправильно обрабатываете исключение, подавляя причину root (или что вы объявили свой класс исключения для подавления любых переданных трассировок стека исключений). Фактически выбрасываемое исключение - это исключение вашего собственного бизнеса.

Вы не разместили содержимое своего метода: com.company.ingest.delegate.BaseDelegate.insertRecords (BaseDelegate. java: 537), но основываясь на том, что вы опубликовали, я собираюсь предположить, что метод выглядит примерно так:

public void insertRecords(...) {
    try {
        repository.save(...);
    } catch (Exception exception) {
        throw new com.company.common.exception.ERDException(exception.toString());
    }
}

Это объясняет, почему генерируемое и регистрируемое исключение не содержит никакой значимой информации. Исключение, которое вы поймали, содержит само сообщение. Он заключает в себе еще одно исключение, которое (мы предполагаем) содержит причину root.

Если мое предположение о вашем методе верно, то следующее изменение предоставит root причину в следующий раз, когда произойдет ошибка, при условии, что ваше исключение передает параметры суперклассу (вплоть до Throwable):

public void insertRecords(...) {
    try {
        repository.save(...);
    } catch (Exception exception) {
        throw new com.company.common.exception.ERDException("Unable to insert record", exception);
    }
}
0 голосов
/ 14 июля 2020

Используйте описанные здесь методы исключения, чтобы устранить причину root исключения в вашей трассировке стека.

https://docs.oracle.com/cd/E17802_01/products/products/persistence/javadoc-1_0-fr/javax/persistence/PersistenceException.html

...