【发布时间】:2018-10-14 20:32:21
【问题描述】:
我有一个 Spring Boot + JPA + Spring 批处理(+Spring 集成)项目。还有 Flyway,配置分开。 我已将 Spring Batch 配置为使用与默认“spring.jpa.datasource”不同的数据源。这可以。 在我的 tasklet 中,我查询了两个数据源,ds1 上的第一个查询正确,ds2 上的第二个查询出错:
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@2fb082ff] for key [HikariDataSource (HikariPool-1)] bound to thread [main]
更多详情: 我为每个数据源都有一个配置类,用
注释@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
在每个配置中,为 DataSource、LocalContainerEntityManagerFactoryBean 和 JpaTransactionManager 定义了一个 bean,并具有自定义名称。
为每个数据源定义一个服务:
@Service @Transactional(transactionManager=JpaApsConfiguration.APS_TRANSACTION_MANAGER, propagation = Propagation.REQUIRES_NEW)
并且使用正确的限定符自动装配实体管理器 (注意:通过 JpaRepository 类进行查询)
关于什么可能导致这种行为的任何建议?谢谢
注意:
- 数据库连接成功
- 我之前有一个不同的错误 (已经修复,但可能会有所帮助): 'NoUniqueBeanDefinitionException' 因为 Spring 无法识别 在我的两个交易之间正确的“PlatformTransactionManager” manager bean 和默认的 transactionManager。
编辑:
这里是错误的完整堆栈跟踪:
2018-05-08 12:12:24 信息 o.s.batch.core.job.SimpleStepHandler - 执行步骤:[STEP#PROCESS_SHIPMENTS] 2018-05-08 12:12:24 错误 o.s.batch.core.step.AbstractStep - 在作业 PROCESS_APS 中执行步骤 STEP#PROCESS_SHIPMENTS 时遇到错误 org.springframework.transaction.CannotCreateTransactionException:无法为事务打开 JPA EntityManager;嵌套异常是 java.lang.IllegalStateException:已为键 [HikariDataSource (HikariPool-1)] 绑定到线程 [main] 的值 [org.springframework.jdbc.datasource.ConnectionHolder@351e89fc] 在 org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:450) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474) 在 org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:289) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) 在 org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) 在 dkr.astreconnector.service.GespeService$$EnhancerBySpringCGLIB$$73dbb368.getValueDetailByUniq() 在 dkr.astreconnector.batch.worker.ShipmentProcessor.process(ShipmentProcessor.java:63) 在 dkr.astreconnector.batch.worker.ShipmentProcessor.process(ShipmentProcessor.java:30) 在 org.springframework.batch.core.step.item.SimpleChunkProcessor.doProcess(SimpleChunkProcessor.java:126) 在 org.springframework.batch.core.step.item.SimpleChunkProcessor.transform(SimpleChunkProcessor.java:303) 在 org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:202) 在 org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:75) 在 org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406) 在 org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330) 在 org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) 在 org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:272) 在 org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81) 在 org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375) 在 org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215) 在 org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145) 在 org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257) 在 org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200) 在 org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148) 在 org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:66) 在 org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67) 在 org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:169) 在 org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144) 在 org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:136) 在 org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:308) 在 org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:141) 在 org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) 在 org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:134) 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:163) 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:179) 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:134) 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:128) 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:790) 在 org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:774) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:335) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1246) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1234) 在 dkr.astreconnector.AstreConnectorBatchApplication.main(AstreConnectorBatchApplication.java:14) 引起:java.lang.IllegalStateException:已绑定到线程 [main] 的键 [HikariDataSource (HikariPool-1)] 的值 [org.springframework.jdbc.datasource.ConnectionHolder@351e89fc] 在 org.springframework.transaction.support.TransactionSynchronizationManager.bindResource(TransactionSynchronizationManager.java:193) 在 org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:425) ...省略了43个常用框架 2018-05-08 12:12:24 信息 osbclsupport.SimpleJobLauncher - 作业:[FlowJob:[name=PROCESS_APS]] 使用以下参数完成:[{run.id=128}] 和以下状态:[FAILED]
【问题讨论】:
-
你能添加你得到的错误的完整堆栈跟踪吗?
-
按要求添加了堆栈跟踪。谢谢。
-
感谢您的建议:顺便说一句,我已经使用这些提示来调试我的代码,但遗憾的是没有结果
-
我终于解决了这个问题:只是在我的批处理配置中,我明确声明了事务管理器的限定符,然后将其传递给我的工作创建工厂。 @Autowired @Qualifier("transactionManager") private PlatformTransactionManager transactionManager;
标签: spring-boot jpa spring-data spring-batch datasource