当前位置: 首页 > 知识库问答 >
问题:

在生产环境中,在spring批处理应用程序中使用哪种事务管理器最好?

章越
2023-03-14

您能告诉我生产中的Spring批处理应用程序应该使用哪个事务管理器吗?我使用的是无资源事务管理器。没事吧?在从外部Oracle DB读取数据时,我遇到了这个问题

[org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler](pool-3130-thread-1)计划任务中出现意外错误:组织。springframework。交易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;
    }

共有1个答案

曾鸿振
2023-03-14

正如您在问题中所说,您使用的是Oracle DB,因此您很可能不需要ResourcesTransansActionManager

您当前的代码所做的是将作业元数据存储到基于映射的内存结构中,我猜您不会在生产环境中这样做,而是将作业元数据存储在数据库中,以便以后进行分析、重新启动等

在Spring Batch中,有两种事务——一种是针对业务数据和方法的事务,另一种是针对作业存储库的事务,假设您希望从文件中读取、写入文件,并希望将作业元数据存储到MapJobRepository中,那么您的代码就可以正常工作了。

但是一旦定义了数据源,就不能使用ResourcesTransactionManager。事实上,对于数据库,您不需要自己定义任何事务管理器,但Spring面向块的批处理将自行处理,并将作业元数据存储到数据库中。

 类似资料:
  • 我正在使用Spring Batch Admin从我的主项目的批处理模块中启动批处理。 在Spring batch Admin项目的依赖项中,将批处理模块编译为JAR addedstrong文本,如下所示: 因为我在一个reader类上添加了“@stepscope”,所以在部署Spring Batch Admin时,我会遇到以下错误 但是我没有找到如何使用类似的声明来防止Spring Batch A

  • 我在批处理作业中使用多线程步骤来处理来自源数据库的记录并写入目标数据库。该步骤基于块,由JdbcpagingItemReader、Processor和JDBCBathItemWriter组成。我明白,如果在步骤处理期间发生任何异常,数据库事务将回滚整个块。我想了解一下Spring batch在内部是如何管理的?由于这是多线程步骤,因此不能保证处理器和写入器在块的同一线程中执行。块可能由不同的线程处

  • 问题内容: 例如,我有10个从AJAX响应生成的标签: 我需要通过循环将onclick事件分配给每个事件: 这是行不通的,它仅将onclick分配给最后一个标签,并警告“ 11”。我该如何工作?我宁愿不使用jQuery。 问题答案: 您所有的处理程序都共享相同的变量。 您需要将每个处理程序放入一个单独的函数作为参数,以便每个处理程序都有自己的变量:

  • 我尝试在一个应用程序中运行Eureka服务器和Spring Boot Admin服务器(SBA Docu说这是可能的)。尤里卡正按预期工作,但管理应用程序仍显示零应用程序。 Spring Boot Version 2.0.3,Spring Boot Admin Version 2.0.1 Eureka和SBA服务器 客户端应用程序。yml

  • 我想编写一个spring boot批处理应用程序,其中我有一个充满事件的数据库表。我想做的是有一个多线程的spring boot批处理应用程序,它将以这种方式工作: 我想有5个线程运行,每个线程将保留一个偏移量来跟踪它读取的事件,以便没有其他线程再次读取相同的事件。我想怎么做: 所以我希望能够在数据库表中为每个线程保留偏移量。有没有办法让Spring Boot环境以这种方式工作?

  • 我有两个spring boot应用程序(客户端)和一个spring boot管理员。我想在客户端应用程序中管理环境变量,但默认情况下,spring boot admin starter客户端和spring boot admin starter server不支持此功能(v1.5.2)。 在我的SBA中,我看到了除环境管理之外的日志、指标等。我试过spring cloud commons和eurek