多线程process和多线程writer

本次介绍AsyncItermProcessor和AsyncItemWriter

在很多场景中,process要处理大量的计算对比工作,计算对比可能还涉及大量的数据库读写工作。要是能将process单独多线程处理,那将会将性能提升很大一截,甚至是指数级的提升。

spring-batch提供了相应的处理方案。使用AsyncItermProcessor和AsyncItemWriter,一般需要组合使用,才能有效提升效率。

process代码

@StepScope
    @Bean("userProcess")
    public ItemProcessor<User, User> userProcess() {
        ItemProcessor<User, User> itemProcessor = user -> {
            //数据处理
            return user;
        };
        return itemProcessor;
    }

    @StepScope
    @Bean("asyncUserProcess")
    public AsyncItemProcessor<User, User> asyncUserProcess(){
        AsyncItemProcessor<User, User> processor = new AsyncItemProcessor<>();
        processor.setDelegate(userProcess());
        processor.setTaskExecutor(new SimpleAsyncTaskExecutor());
        return processor;
    }

writer代码

@Bean("userWriter")
    public JdbcBatchItemWriter<User> userWriter() {
        JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<>();
        //设置数据源
        writer.setDataSource(dataSource);
        //设置sql
        writer.setSql("insert into user (user_id,user_name) values (:userId,:userName)");
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
        return writer;
    }

    @Bean("asyncUserWriter")
    public AsyncItemWriter<User> asyncUserWriter(){
        AsyncItemWriter<User> writer = new AsyncItemWriter<>();
        writer.setDelegate(this.userWriter());
        return writer;
    }

step和job代码

@Autowired
@Qualifier("asyncUserWriter")
AsyncItemWriter<User> asyncUserWriter;

@Autowired
@Qualifier("asyncUserProcess")
AsyncItemProcessor<User, User> asyncUserProcess;


    @Bean
    public Job userJob() {
        return jobBuilderFactory.get("userJob")
                .start(userStep())
                .build();
    }

    @StepScope
    @Bean
    public Step userStep() {
        return stepBuilderFactory.get("userStep")
                .<User, Future<User>>chunk(2)
                .reader(userReader)
                .processor(asyncUserProcess)
                .writer(asyncUserWriter)
                .build();
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Oracle数据库支持多线程并发处理,这对于提高系统的并发性能非常重要。 Oracle数据库多线程并发是通过使用多个后台进程来实现的。以下是一些与Oracle多线程并发相关的重要概念: 1. 前台进程:前台进程是用户连接到数据库时启动的进程,负责处理用户请求。每个前台进程都会分配一个后台进程。 2. 后台进程:后台进程是由Oracle数据库自动启动和管理的进程,用于执行不需要用户交互的任务。其中一些后台进程与多线程并发有关: - System Monitor (SMON):SMON负责数据库实例的恢复、数据块的回收和清理等任务。 - Process Monitor (PMON):PMON负责监控数据库实例和维护失败的服务器进程。 - Database Writer (DBWn):DBWn负责将脏数据块写回磁盘,以保证数据的一致性。 - Log Writer (LGWR):LGWR负责将数据库的重做日志写回磁盘,以确保数据的持久性。 - Checkpoint (CKPT):CKPT负责更新数据库的检查点信息,以支持数据库的恢复。 3. 数据库实例:数据库实例是Oracle数据库在内存中运行的副本。每个实例都有自己的内存结构和后台进程。多个实例可以同时访问同一个数据库。 4. 数据库连接:当用户连接到Oracle数据库时,一个前台进程会被分配给用户,并与一个后台进程进行关联。这种关联允许并行处理多个用户请求。 通过合理配置和管理后台进程,Oracle数据库可以实现高并发处理,提供快速响应和高吞吐量的能力。同时,多线程并发也有助于提高系统的可用性和容错性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个码农不太萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值