在生产环境中,在spring批处理应用程序中使用哪种事务管理器最好?
您能告诉我哪种事务管理器应该用于生产中的Spring批处理应用程序吗?我使用的是无资源事务管理器。好吗?在从外部Oracle DB读取数据时,我遇到了这个问题在生产环境中,在spring批处理应用程序中使用哪种事务管理器最好?,spring,spring-batch,spring-transactions,Spring,Spring Batch,Spring Transactions,您能告诉我哪种事务管理器应该用于生产中的Spring批处理应用程序吗?我使用的是无资源事务管理器。好吗?在从外部Oracle DB读取数据时,我遇到了这个问题 [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler] (池-3130-thread-1)计划任务中出现意外错误: org.springframework.transaction.CannotCreateTransactionException: 无法为
[org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler]
(池-3130-thread-1)计划任务中出现意外错误:
org.springframework.transaction.CannotCreateTransactionException:
无法为事务打开JDBC连接;嵌套异常是
java.sql.SQLRecoverableException:关闭连接
正如您在问题中所说,您使用的是Oracle DB,因此您很可能不需要
ResourcesStransActionManager
您当前的代码所做的是将作业元数据存储到内存中基于映射的结构中,我猜您不会在生产中这样做,而是将作业元数据存储在DB中,以便以后进行分析、重新启动等
在Spring Batch中,有两种事务—一种是针对业务数据和方法的事务,另一种是针对作业存储库的事务,假设您希望从文件中读取、写入文件并希望将作业元数据存储到MapJobRepository
中,那么您的代码就可以正常工作了
但是在定义
数据源的那一刻,就不能使用ResourcesStransActionManager
。事实上,对于数据库,您不需要自己定义任何事务管理器,但Spring面向块的批处理将自行处理,并将作业元数据存储到数据库中 检查或嗨,我检查了你共享的链接,但我的问题是不同的。我不确定我的Spring批处理应用程序是否必须使用DataSourceTransactionManager或ResourcelessTransactionManager。您可以建议吗?那么您在存储库配置中设置的txManager
是ResourcesTransansActionManager
?指定您的业务数据源和目标以及您的作业元数据源和目标。只是说Oracle DB不够信息,请提供目的。您好,这是一个Spring boot with Spring batch应用程序,我正在连接到一个外部Oracle DB,从中读取数据并将其写入目标SQLServer。它正常运行了几天,但之后开始抛出计划任务中出现的意外错误:org.springframework.transaction.CannotCreateTransactionException:无法打开事务的JDBC连接;嵌套异常为java.sql.SQLRecoverableException:关闭连接。你能给点建议吗?嗨,谢谢你的更新。此链接包含有关我的数据源配置的详细信息
@Bean
public ResourcelessTransactionManager resourcelessTransactionManager() {
return new ResourcelessTransactionManager();
}
@Bean
public MapJobRepositoryFactoryBean mapJobRepositoryFactory(
ResourcelessTransactionManager txManager) throws Exception {
//LOGGER.info("Inside mapJobRepositoryFactory method");
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean(txManager);
factory.setTransactionManager(txManager);
factory.setIsolationLevelForCreate("ISOLATION_READ_UNCOMMITTED");
factory.afterPropertiesSet();
return factory;
}
@Bean
public JobRepository jobRepository(
MapJobRepositoryFactoryBean factory) throws Exception {
//LOGGER.info("Inside jobRepository method");
return factory.getObject();
}
@Bean
public ThreadPoolTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(30);
return taskExecutor;
}
@Bean
public JobLauncher jobLauncher(JobRepository jobRepository,ThreadPoolTaskExecutor taskExecutor) {
//LOGGER.info("Inside jobLauncher method");
SimpleJobLauncher launcher = new SimpleJobLauncher();
launcher.setTaskExecutor(taskExecutor);
launcher.setJobRepository(jobRepository);
final SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
launcher.setTaskExecutor(simpleAsyncTaskExecutor);
return launcher;
}