Может ли кто-нибудь дать мне пример того, как вызывать транзакции БД в запланированных задачах, используя Spring Boot 1.4.2.RELEASE, пожалуйста? Большое спасибо.Как сделать транзакции базы данных в запланированных задачах в Spring Boot 1.4.2.RELEASE
Я использовал Spring Boot 1.4.2.RELEASE для создания запланированной задачи через @Scheduled(fixedRate = 5000) @Transactional(propagation = Propagation.REQUIRES_NEW)
и использовал @Autowired
, чтобы получить экземпляр JpaRepository
.
@Scheduled(fixedRate = 5000)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void importDataFromDat() {
List records = datUploadRecordRepository.findAllByImportTime();
for (DatUploadRecord record : records) {
record.setImportTime(new Date());
datUploadRecordRepository.save(record);
// datUploadRecordRepository.updateImportTime(new Date(), record.getId());
}
}
- Он может вернуть результаты выбора SQL, но он не может сохранить объекты в БД.
- Если я создаю свой собственный метод обновления в моем собственном JpaRepository вместо вызова метода сохранения(), то это вызовет ошибку ниже:
org.springframework.dao.InvalidDataAccessApiUsageException: Выполнение обновленные данные/удалить запрос; вложенное исключение javax.persistence.TransactionRequiredException: Выполнение в обновление/удаление запроса на org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible (EntityManagerFactoryUtils.java:413) ~ [весна-ОРМ-4.3.4.RELEASE. jar: 4.3.4.RELEASE] в org.springframework.orm.hibernate5.HibernateExceptionTranslator.translateExceptionIfPossible (HibernateExceptionTranslator.java:55) ~ [spring-orm-4.3.4.RELEASE.jar: 4.3.4.RELEASE] at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible (ChainedPersistenceExceptionTranslator.java:59) ~ [пружинно-ТХ-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.dao.support. DataAccessUtils.translateIf Необходимое (DataAccessUtils.java:213) ~ [пружинно-ТХ-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor.java:147) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4 .RELEASE.jar: 4.3.4.RELEASE] на org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke (CrudMethodMetadataPostProcessor.java:133) ~ [весенне-данных JPA-1.10.5. RELEASE.jar: na] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:17 9) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor.java:92) ~ [spring-aop- 4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3 .4RELEASE] на org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:213) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на com. sun.proxy. $ Proxy112.updateImportTime (Неизвестный источник) ~ [na: na] в com.crane.schedules.ImportToDBFromDAT.importDataFromDat (ImportToDBFromDAT.java:65) ~ [classes /: na] atcom.crane.schedules.ImportToDBFromDAT $$ FastClassBySpringCGLIB $$ 847b3ccb.invoke() ~ [/ классы: па] в org.springframework.cglib.proxy.MethodProxy.invoke (MethodProxy.java:204) ~ [весна -core-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint (CglibAopProxy.java:720) ~ [весенне-AOP-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:157) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) ~ [spring-tx-4.3. 4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:282) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4 .RELEASE] на org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96) ~ [spring-tx-4.3 .4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3. 4.RELEASE] в org.springframework.aop.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept (CglibAopProxy.java:655) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на com .crane.schedules.ImportToDBFromDAT $$ EnhancerBySpringCGLIB $$ 971e70c9.importDataFromDat() ~ [/ классы: на] в sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) ~ [на: 1.8.0_60] на sun.reflect .NativeMethodAccessorImpl.invoke (Неизвестный источник) ~ [na: 1.8.0_60] на sun.reflect.DelegatingMethodAccessorImpl.invoke (Неизвестный источник) ~ [na: 1.8.0_60] at java.lang.reflect.Method.invoke (Неизвестный источник) ~ [na: 1.8.0_60] на org.springframework.scheduling.support.ScheduledMethodRunnable.run (ScheduledMethodRunnable.java: 65) ~ [spring-context-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run (DelegatingErrorHandlingRunnable.java:54) ~ [spring-context- 4.3.4.RELEASE.jar: 4.3.4.RELEASE] в java.util.concurrent.Executors $ RunnableAdapter.call (Неизвестный источник) [na: 1.8.0_60] в java.util.concurrent.FutureTask.runAndReset (Неизвестно Источник) [na: 1.8.0_60] at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 301 (Неизвестно Источник) [na: 1.8.0_60] в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (Неизвестно Источник) [na: 1.8.0_60] в java.util.concurrent.ThreadPoolExecutor.runWorker (Неизвестный источник) [na: 1.8.0_60] at java.util.concurrent.ThreadPoolExecutor $ Worker.run (Неизвестный источник) [na: 1.8.0_60] at java.lang.Thread.run (Неизвестный источник) [na: 1.8. 0_60] Вызванный: javax.persistence.TransactionRequiredException: Выполнение обновленные данные/удалить запрос на org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate (AbstractQueryImpl.java:54) ~ [зимуют-EntityManager-5.0.11. Final.jar: 5.0.11.Final] в org.springframework.data.jpa.repository.query.JpaQueryExecuti on $ ModifyingExecution.doExecute (JpaQueryExecution.java:242) ~ [spring-data-jpa-1.10.5.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.JpaQueryExecution.execute (JpaQueryExecution .java: 82) ~ [spring-data-jpa-1.10.5.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute (AbstractJpaQuery.java:116) ~ [spring-data-jpa-1.10.5.RELEASE.jar: na] в org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute (AbstractJpaQuery.java:106) ~ [spring-data-jpa- 1.10.5.RELEASE.jar: na] в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.doInvoke (RepositoryFactorySupport.java:482) ~ [spring-data-commons-1.12.5.RELEASE.jar: na] в org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.invoke (RepositoryFactorySupport.java:460) ~ [spring-data-commons-1.12.5.RELEASE.jar: na ] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.springframework.data. projection.DefaultMethodInvokingMethodInterceptor.invoke (DefaultMethodInvokingMethodInterceptor.java:61) ~ [spring-data-commons-1.12.5.RELEASE.jar: na] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4.RELEASE.jar: 4.3.4.RELEASE] на org.spring framework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport. invokeWithinTransaction (TransactionAspectSupport.java:282) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke (TransactionInterceptor.java:96) ~ [spring-tx-4.3.4.RELEASE.jar: 4.3.4.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) ~ [spring-aop-4.3.4 .RELEASE.jar: 4.3.4.RELEASE] в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExcep tionTranslationInterceptor.java:136) ~ [весна-ТХ-4.3.4.RELEASE.jar: 4.3.4.RELEASE] ... 31 общие рамки опущена
Я бы сказал, что метод обновления в вашем репозитории должен быть транзакционным. Не запланированная задача. –
Благодарим вас за ответ. Я сделал метод обновления Transactional, но результат такой же, как и выше. –
Ваша весенняя загрузка правильно активировала транзакционное управление? (I.e. Вы добавили аннотации '@ EnableAutoConfiguration' ' @ EnableJpaRepositories' '@ EnableTransactionManagement' в вашем классе конфигурации?) –