一篇文章教你学会SpringBatch使用分区读取数据库

springBatch批处理框架(二)实战 一·、概览 之前我们了解了如何创建一个springBatch的项目,这篇文章我们一起来学习一下,如何应用框架进行数据。 阅读详情

Spring Batch 支持使用分区来读取数据库中的数据并并行处理。在讲SpringBatch使用分区读取数据库之前先介绍下EnableBatchProcessing。

目录

一、@EnableBatchProcessing

二、Spring Batch 使用分区来读取数据库


一、@EnableBatchProcessing

@EnableBatchProcessing 注解会自动配置一个数据源(DataSource)用于 Spring Batch 的作业存储。它使用了一个嵌入式数据库(通常是H2)作为默认的数据源,用于存储 Spring Batch 的元数据(metadata),例如作业的状态、运行历史和参数等。

如果你想要配置自定义数据源,你可以通过 BatchConfigurer 接口来覆盖默认的配置。例如:

import javax.sql.DataSource;

import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CustomBatchConfigurer extends DefaultBatchConfigurer {

    @Override
    public void setDataSource(DataSource dataSource) {
        // 自定义数据源的设置
        super.setDataSource(dataSource);
    }
}

在上述示例中,CustomBatchConfigurer 类扩展了 DefaultBatchConfigurer,并覆盖了 setDataSource 方法,以便设置自定义数据源。这使你可以使用你自己的数据库来存储 Spring Batch 的元数据。

总之,@EnableBatchProcessing 会自动初始化一个数据源用于 Spring Batch 的元数据存储,但你可以配置自定义数据源以满足你的特定需求。在生产环境中,通常会使用一个持久的数据库来存储元数据,而在开发和测试环境中可以使用嵌入式数据库。

二、Spring Batch 使用分区来读取数据库

1、创建一个 Data 类来表示数据库中的数据:

public class Data {
    private int id;
    private String name;

    // getters and setters
}

2、创建一个 Spring Batch 配置类

import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.partition.PartitionHandler;
import org.springframework.batch.core.partition.StepExecutionSplitter;
import org.springframework.batch.core.partition.support.Partitioner;
import org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler;
import org.springframework.batch.item.database.JdbcPagingItemReader;
import org.springframework.batch.item.database.PagingQueryProvider;
import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceUtils;

import javax.sql.DataSource;

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Bean
    public Step partitionedStep(StepBuilderFactory stepBuilderFactory, Partitioner partitioner,
                                PartitionHandler partitionHandler) {
        return stepBuilderFactory.get("partitionedStep")
            .partitioner("workerStep", partitioner())
            .step(workerStep())
            .gridSize(4) // 设置分区数量
            .taskExecutor(new SimpleAsyncTaskExecutor())
            .partitionHandler(partitionHandler())
            .build();
    }

    @Bean
    public Step workerStep() {
        return stepBuilderFactory.get("workerStep")
            .<Data, Data>chunk(1)
            .reader(itemReader(null))
            .writer(itemWriter())
            .build();
    }

    @Bean
    public Partitioner partitioner(DataSource dataSource) {
        return gridSize -> {
            Map<String, ExecutionContext> partitions = new HashMap<>();
            PagingQueryProvider queryProvider = pagingQueryProvider(dataSource);
            JdbcPagingItemReader<Data> reader = itemReader(dataSource, queryProvider);
            PartitionHandler handler = partitionHandler(dataSource, reader);
            for (int i = 0; i < gridSize; i++) {
                ExecutionContext context = new ExecutionContext();
                context.put("partitionId", i);
                context.put("minValue", i * 100); // 设置分区查询条件
                context.put("maxValue", (i + 1) * 100 - 1);
                partitions.put("partition" + i, context);
            }
            return partitions;
        };
    }

    @Bean
    public PagingQueryProvider pagingQueryProvider(DataSource dataSource) {
        SqlPagingQueryProviderFactoryBean factoryBean = new SqlPagingQueryProviderFactoryBean();
        factoryBean.setSelectClause("SELECT id, name");
        factoryBean.setFromClause("FROM user");
        factoryBean.setWhereClause("WHERE id >= :minValue AND id <= :maxValue");
        factoryBean.setSortKey("id");
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }

    @Bean
    public JdbcPagingItemReader<Data> itemReader(DataSource dataSource, PagingQueryProvider queryProvider) {
        JdbcPagingItemReader<Data> reader = new JdbcPagingItemReader<>();
        reader.setDataSource(dataSource);
        reader.setPageSize(100); // 设置每次读取的数据量
        reader.setQueryProvider(queryProvider);
        reader.setRowMapper((resultSet, i) -> {
            Data data = new Data();
            data.setId(resultSet.getInt("id"));
            data.setName(resultSet.getString("name"));
            return data;
        });
        return reader;
    }

    @Bean
    public PartitionHandler partitionHandler(DataSource dataSource, JdbcPagingItemReader<Data> reader) {
        TaskExecutorPartitionHandler handler = new TaskExecutorPartitionHandler();
        handler.setStep(workerStep());
        handler.setGridSize(4); // 设置分区数量
        handler.setTaskExecutor(new SimpleAsyncTaskExecutor());
        handler.setJobExplorer(jobExplorer(dataSource));
        return handler;
    }

    @Bean
    public StepExecutionSplitter stepExecutionSplitter(DataSource dataSource) {
        return new StepExecutionSplitter(jobExplorer(dataSource), "partitionedStep");
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

在上面的配置中,我们定义了一个包含两个步骤的作业:partitionedStep 和 workerStep。partitionedStep 是一个分区步骤,负责使用分区读取数据库的数据。workerStep 是用于实际处理数据的步骤。我们还配置了一个分区处理器,指定分区数量和任务执行器。

3、创建一个执行器类,用于启动 Spring Batch 作业

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class JobExecutor {

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private Job job;

    public void executeJob() throws Exception {
        jobLauncher.run(job, new JobParameters());
    }
}

这个执行器类通过注入 JobLauncher 和作业 Job 来启动 Spring Batch 作业。

SpringBatch 根据Spring官网描述,Spring Batch是一个轻量级的、完善的批处理应用框架,旨在支持企业系统建立健壮、高效的批处理应用。然而Spring Batch不是一个调度框架,它只关注于任务的处理,如日志监控、事务、并发问题等,但是它可以与其它调度框架一起联合使用,完成相应的调度任务,如Quartz、Tivoli、Control-M等。Spring Batch提供了很多非常实用的组件,包括了日志/跟踪、事务管理、作业处理统计、作业重新启动、跳过和资源管理。它还提供了更先进的技术服务和功能,支持通过。 阅读详情

相关推荐

Spring Batch并发加分区读取数据库的完美优化方案

** 今天我们会介绍Spring Batch批处理读写大型数据库的优化方案 背景介绍 现在我们有两个数据库,数据库A是新数据库,里面保存了公司所有员工的员工工号,数据库B是老数据库,里面保存了公司所有员工对应的详细信息,数据库B里面的数据会每天被定时任务更新。 我们希望用两个定时任务来维护我们的两个数据库,第一个定时任务会把数据库A中所有的员工工号发送给人力资源部门系统,再把从人力资源部门返回的信息写到公司的云盘中。 第二个定时任务会读取云盘中被写入的文件,解析并写出到数据库B中,从而达到每日更新的目的。

ShengmingXu的博客 2218

关于@EnableBatchProcessing注解

如果用java config的方式配置spring batch中的相关bean,则可能会遇到@EnableBatchProcessing这个注解。 这个注解的用法一般出现在配置文件的上方,如下所示: @Configuration @EnableBatchProcessing public class BatchConfig { @Autowired private J...

Chris___的专栏 6882

全网最详细SpringBatch批处理读取分区(Paratition)文件讲解

文章目录一、分区Step1、数据分区2、分区处理二、实现分区关键接口1、Partitioner2、StepExecutionSplitter3、PartitionHandler三、基本配置和属性说明1、基本配置2、属性说明四、文件分区1、定义分区文件Partitioner2、定义文件读3、定义分区job配置4、定义processor4、定义writer4、定义step监听器6、运行job 写在前面: 我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年

境里婆娑 6665

Spring Batch 高级篇-分区步骤

了解Spring Batch并行步骤后,接下来一起学习一下Spring Batch 高级功能-分区步骤

langfeiyes的博客 3151

SpringBatch 批处理分区(Partitioner )分片(九)

文章目录一、cat表数据准备1、cat实体类2、数据库表cat和数据3、application.properties配置文件二、分区catPartitionerJob配置1、分区reader2、分区writer3、分区processor4、CatPartitioner分区5、job配置 前言: 在Springbatch中,Partitioning意味着对数据进行分片,然后每片实现专门处理,假设单...

境里婆娑 1万+

史上最全的SpringBatch学习教程

写在前面: 我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。 写博客的目的就是分享给大家一起学习交流,如果您对 Java感兴趣,可以关注我,我们一起学习 相关文章: 今天我把写过的SpringB系列的文章全部整理在此,方便大家学习查看!博客里面都是基于 Spring Boot 2.2.2 版本的学习...

境里婆娑 4247

SpringBatch中使用分区及多线程性能比较

表结构说明:借据表(测试之前批量写入了200万数据);借据备份表1(使用多线程处理);借据备份表2(使用分区处理) CREATE TABLE `t_batch_duebill` ( `duebillno` char(32) NOT NULL COMMENT '借据号', `...

chenying0724的博客 2344

SpringBatch 读取JSON(JsonItemReader)用法(十一)

文章目录一、抽取顺序读取数据库公共reader二、processor三、配置读取json数据job四、执行job SpringBatch其它文章直通车: SpringBatch读单个文件(FlatFileItemReader)和写单个文件(FlatFileItemWriter)(一) SpringBatch顺序读取多文件(MultiResourceItemReader)和顺序写文件(MultiR...

境里婆娑 1985

cfg文件详细讲解_全网最详细SpringBatch读取分区文件讲解

写在前面: 我是「境里婆娑」。我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却。写博客的目的就是分享给大家一起学习交流,如果您对 Java感兴趣,可以关注我,我们一起学习。前言:为什么要写这篇文章,在网上很难找到一篇关于SpringBatch批处理读取分区文件基于JavaBean配置的文章,因此我决定写一篇关于Spring...

weixin_39653405的博客 462

SpringBatch 读取xml文件(StaxEventItemReader)用法(十三)

文章目录一、pom文件引入需要读取xml文件jar包二、抽取读取xml文件公共reader三、processor四、配置读取xml文件job五、执行job 前言:在一些业务场景中,可能需要读取xml文件,做业务逻辑处理,SpringBatch已经帮我们封装好了读取xml的reader SpringBatch其它文章直通车: SpringBatch读单个文件(FlatFileItemReade...

境里婆娑 1988

SpringBatch job执行流程分析(十六)

前言:前面文章已经介绍了很多种读取文件和写出文件多种方式以及一些job的其他监听器用法,这一章我们将把job的整个执行过程理一下。 SpringBatch其它文章直通车: SpringBatch读单个文件(FlatFileItemReader)和写单个文件(FlatFileItemWriter)(一) SpringBatch顺序读取多文件(MultiResourceItemReader)和顺...

境里婆娑 2434

SpringBatch批处理实战教程

文章目录1、SpringBatch概述1.1 概述1.2 框架主要有以下功能:1.3 框架一共有4个角色:2.搭建SpringBatch项目2.1 [用Spring initializr搭建](https://start.spring.io/)2.2 解压缩导入IDEA2.3 启动项目前添加数据库驱动依赖3.SpringBatch入门程序3.1 创建confing包写一个类JobConfiguration3.2 添加Job、Step注入3.3 创建任务对象(代码如下)4. h2数据库替换为Mysql4.1

慕言 3642

spring Batch实现数据库大数据量读写

NULL 博文链接:https://virusfu.iteye.com/blog/1150730

SpringBatch介绍与使用(上)

Spring Batch是一个轻量级的、完善的批处理应用框架,旨在支持企业系统建立健壮、高效的批处理应用。然而Spring Batch不是一个调度框架,它只关注于任务的处理,如日志监控、事务、并发问题等,但是它可以与其它调度框架一起联合使用,完成相应的调度任务,如Quartz、Tivoli、Control-M等Spring Batch提供了很多非常实用的组件,包括了日志/跟踪、事务管理、作业处理统计、作业重新启动、跳过和资源管理。

qq_65377318的博客 1200

PyTorch+C3D实战:用UCF101数据集训练你的第一个视频动作识别模型(附完整代码)

本文详细介绍了如何使用PyTorch和C3D模型在UCF101数据集上构建视频动作识别系统。从环境配置、数据预处理到模型训练与优化,提供了完整的代码实战指南,帮助开发者快速掌握视频行为识别技术。文章特别强调了3D卷积核设计、混合精度训练等关键技术要点,并分享了模型部署优化经验。

weixin_29233857的博客 218

保姆级教程:用NVIDIA Jetson AGX Xavier和GMSL2相机搭建8路车载视觉原型系统

本文提供了一份详细的教程,指导如何使用NVIDIA Jetson AGX Xavier开发板和GMSL2相机搭建8路车载视觉原型系统。内容涵盖硬件选型、系统架构设计、软件环境配置、多路视频采集实现以及性能优化与问题排查,帮助开发者快速掌握GMSL2技术在车载视觉系统中的应用。

weixin_42525005的博客 295

SpringBatch概述

1、SpringBatch简介 1.1、简介 根据Spring官网描述,Spring Batch是一个轻量级的、完善的批处理应用框架,旨在支持企业系统建立健壮、高效的批处理应用。然而Spring Batch不是一个调度框架,它只关注于任务的处理,如日志监控、事务、并发问题等,但是它可以与其它调度框架一起联合使用,完成相应的调度任务,如Quartz、Tivoli、Control-M等。 Sprin...

qq_36526036的博客 7962

3.DJI-payload SDK自定义控件的设计:

自定义控件(Widget)是指负载运行时,在用户界面中显示的自定义 UI 控件,以帮助用户快速查看负载独特的设备状态,或者对负载设进行设置。这些 UI 控件可以显示在以下用户界面中。Pilot 2 应用程序;大疆智图;基于 MSDK 开发的应用程序。这种自定义控件并不是通过 MSDK 实现的,而是通过 PSDK 的配置实现的。。

哒宰的博客 770

批处理框架springbatch读取文件入库mysql比flink更快

百万数据springbatch批处理入库mysql比flink要快

于采柳的博客 1424

LIN协议V2.2A版介绍

IN 协议规范2.2A 版(2010 年 12 月发布)是面向低成本汽车网络的标准,核心采用单主多从架构,支持最高20kbit/s速率,通过单总线实现通信;定义了完整的协议栈(含协议层、传输层、物理层等),规定了帧结构(含 Break 字段、Sync 字节、保护标识符 PID、数据字段、校验和)、5 类帧类型(无条件帧、事件触发帧等)及调度表机制以保障确定性传输;

qflook的博客 319

机器人的“大脑”进化论:从专用控制器到高性能SoC的异构计算时代

摘要:随着AI与机器人技术融合,高性能芯片成为机器人智能化的关键。本文分析了机器人对芯片的核心需求,包括多模态数据处理、实时控制和智能决策能力。系统级芯片(SoC)因集成CPU、GPU/NPU等模块而成为主流选择。市场呈现分层格局:中低端设备(如扫地机器人)采用"MCU+轻量SoC"方案,满足基础功能;高端机器人则依赖"高性能SoC+独立GPU"处理复杂任务。除主控芯片外,完整的机器人系统还需传感器接口、驱动、通信等配套芯片。未来,芯片技术的进步将持续推动机器人智能化

致力于lidar应用开发 83

SpringBatch的详细学习笔记

文章目录Gittee地址SpringBatch的学习笔记第一章 SpringBatch入门第一节 SpringBatch概述第二节 搭建SpringBatch项目第三节 SpringBatch入门程序第四节 替换为MySQL数据库第五节 核心API第二章 作业流第一节 Job的创建和使用第二节 Flow的创建和使用第三节 split实现并发执行第四节 决策器的使用第五节 Job的嵌套第六节 监听器的使用第七节 Job参数第三章 数据输入第一节 ItemReader概述第二节 从数据库中读取数据第三节 从普通

有时间可以指导毕业设计,可以私聊我。一个热爱编程的smallCuteMonkey,可以私信我 2386

基于单片机的宠物狗智能项圈设计

GPS定位功能:利用GPS模块实时获取宠物的位置,帮助主人追踪宠物的活动轨迹。活动监测:使用加速度传感器监测宠物的活动情况,如运动、休息等,并进行分析。健康监测:集成心率传感器,实时监控宠物的心率,以确保其健康。声音识别功能:通过麦克风捕捉宠物的叫声,检测宠物的状态(如饥饿、疼痛等)。蓝牙/Wi-Fi通信:通过蓝牙或Wi-Fi模块与手机APP或云端平台进行数据交互,实时反馈宠物的状态信息。电池管理:实现低功耗设计,确保设备的续航能力。

2201_76125393的博客 2281

SpringBatch系列文章--概念

批处理介绍 企业域内的许多应用程序都需要批量处理才能在关键任务环境中执行业务操作。这些业务包括: 自动,复杂地处理大量信息,无需用户交互即可最有效地进行处理。这些操作通常包括基于时间的事件(例如月末计算,通知或通信)。 定期应用非常大的数据集(例如,保险利益确定或费率调整)重复处理复杂的业务规则。 从内部和外部系统接收的信息的集成,通常需要格式化,验证和以事务方式进行的处理到记录系统中。批处理用于每天为企业处理数十亿笔交易。 Spring Batch是一个轻量级的,全面的批处理框架,旨在支持开发对企

技术摸索和实践者 303

RT-DETR的AIF模块+YOLOv8:融合注意力与特征交互,打造实时检测的科研级进阶方案

从理解AIF模块“细粒度注意力+跨尺度交互”的核心设计,到亲手将其嵌入YOLOv8并验证在复杂场景的表现,再到基于此探索属于自己的科研与工程方向——这个过程能让你深刻理解“注意力机制与CNN融合”在实时检测中的核心价值。现在就开始行动,相信你会在实时目标检测的“智能进化”之路上,走出一条属于自己的技术路径。从实验对比图可见,集成AIF模块的YOLOv8,其mAP(平均精度)在多个阈值下均有提升,尤其是mAP50-95(高IoU阈值下的精度)提升更为显著,充分证明了AIF对细粒度特征的捕捉能力。

m0_64661770的博客 188

Python和Spyder:一个完美的编程组合

而Spyder作为一个专门为科学计算和数据分析而设计的IDE,提供了高效的开发环境和丰富的工具。无论是初学者还是专业开发者,Python和Spyder都能满足他们的需求,并为他们的工作带来便利和效率。本文将探讨Python和Spyder之间的关系,以及它们如何相互配合,提供一流的编程体验。每个工具都有其特定的优势和适用场景,开发者可以根据自己的需求选择合适的工具。而Spyder作为一个专门为科学计算而设计的IDE,提供了编写、调试和执行Python代码的环境。

CodeHeroicX的博客 1123
上一篇: 面试系列 - Redis分布式锁3种实现方式对比分析
下一篇: logback.xml配置详解
境里婆娑
境里婆娑 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 1万+粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

境里婆娑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值