spring JdbcTemplate批量插入 怎么获得数据库自动增长的id

spring JdbcTemplate批量插入 怎么获得数据库自动增长的id,第1张

spring

JdbcTemplate批量例子:

@Override

public

void

saveBatch(final

List<Employee>

employeeList)

{

final

int

batchSize

=

500;

for

(int

j

=

0;

j

<

employeeListsize();

j

+=

batchSize)

{

final

List<Employee>

batchList

=

employeeListsubList(j,

j

+

batchSize

>

employeeListsize()

employeeListsize()

:

j

+

batchSize);

getJdbcTemplate()batchUpdate(QUERY_SAVE,

new

BatchPreparedStatementSetter()

{

@Override

public

void

setValues(PreparedStatement

ps,

int

i)

throws

SQLException

{

Employee

employee

=

batchListget(i);

pssetString(1,

employeegetFirstname());

pssetString(2,

employeegetLastname());

pssetString(3,

employeegetEmployeeIdOnSourceSystem());

}

@Override

public

int

getBatchSize()

{

return

batchListsize();

}

});

}

}

主键自动增加可以在db层面建立sequence来实现,在插入的时候这么写:

Long

newPersonId

=

holdergetKey()longValue();

批处理任务是大多数IT项目的一个重要组成部分,批处理在业务系统中负责处理海量的数据,无须人工干预就能够自动高效的进行复杂的数据分析和处理。批处理会定期读入批量数据,经过相应的业务处理进行归档的业务 *** 作,批处理的特征是自动执行,处理的数据量大,定时执行。将整个批处理的流程按逻辑划分可以分为读数据,处理数据和写数据。以下是整理的springbatch框架的简介知识,希望能帮助到大家。

springbatch对批处理本身的特性进行了抽象,将批处理作业抽象为job和jobstep,将批处理的处理过程分解为数据读,数据处理和数据写。

将异常处理机制分为跳过,重启和重试。将作业的分区分为多线程,并行远程和分区。

springbatch不是一个调度框架,但需要调度框架来配合完成批处理任务,它只关注批处理相关的任务问题,但没有提供相应的调度功能,如果需要使用调度功能,需要使用调度框架,这里介绍一个比较常用的调度框架quartz,可以配合springbatch完成批处理的任务调度。

springbatch的架构分为三层:基础架构层,核心层和应用层。应用层包含所有的批处理作业,核心层主要提供JobLauncher、Job和step,基础架构层主要提供通用的读(ItemReader)、写(ItemWriter)和服务处理(如:RetryTemplate重试模板;RepeatTemplate:重复模板),Spring

batch的三层架构体系使得Springbatch框架可以在不同的层级进行扩展,避免不同层级之间的相互影响。

job的介绍

批处理的作业是由一组step组成,同时job本身也是配置文件的顶级元素。每个作业都有自己的名字,可以定义step的执行顺序,以及定义作业是否可以重启。job执行的时候会生成一个jobinstance(作业实例)和一个jobexecution(作业执行器)。jobinstance包含执行job期间产生的数据以及job执行的状态信息;1个job可以对应多个jobinstance,1个jobinstance可以对应多个jobexecution。

job的配置的主要属性有id(作业的唯一标识)、job-repository(定义作业仓库)、incrementer(作业参数递增器)、restartable(作业是否重启)、parent(指定该作业的父作业)、abstract(定义作业是否抽象)。

step的介绍

step表示作业中一个完整的步骤,一个job可以由一个或者多个step组成,step主要负责批处理运行过程中的主要业务逻辑的实现。回龙观电脑培训认为每次step执行的时候会生成一个或者多个jobexecution,每次任务执行失败的时候,等到下次重新执行该任务的时候就会为该任务的step重新生成一个stepexecution。

首先,Spring Batch运行的基本单位是一个Job,一个Job就做一件批处理的事情。

一个Job包含很多Step,step就是每个job要执行的单个步骤。

如下图所示,Step里面,会有Tasklet,Tasklet是一个任务单元,它是属于可以重复利用的东西。

然后是Chunk,chunk就是数据块,你需要定义多大的数据量是一个chunk。

Chunk里面就是不断循环的一个流程,读数据,处理数据,然后写数据。Spring Batch会不断的循环这个流程,直到批处理数据完成。

read是负责读取数据。spring batch 有很多其实现,能够针对不同的场景进行选择。例如:经常会用到的文件读取实现FlatFileItemReader,能够针对大部分文件进行读取。

process是数据处理器,在数据流从read到writer过程中,可以对数据流进行校验。使之能够对输入的数据进行检查。

writer是负责写数据。spring batch也有很多实现。例如:AmqItemWriter,FlatFileItemWriter,MybatisBatchItemWriter,ListItemWriter等等。

在对以上的基本概念和流程进行了解后,对于项目的功能已经有了初步的代码实现。

就当开始编写代码时,遇到了一个问题。spring batch提供的reader,不能读取项目中所使用的文件。项目中使用的是gz的压缩型文件,spring batch FlatFileItemReader 不能正确的读取文件内容。尝试着对gz文件的解压文件进行读取,能够得到正确文件内容。如果这样的话,每次读取文件都要先解压再去读取,比较麻烦。就在一筹莫展之际,突然灵机一动,联想到之前做过的项目能够对gz文件进行读取的GZIPInputStream,其实也算是一种数据流,既然都是数据流,能不能把gz的数据流适配到FlatFileItemReader中。说干就干,于是翻看了FlatFileItemReader的源码,发现其接收一个Resource的参数。其中就是对数据流的包裹。

FaltFileItemReader

截图中显示通过resource创建出BufferedReader能够对文件进行行读取 *** 作。

然后我通过继承Resource接口然后通过对象适配器模式,适配FileSystemRes

springbatch不写表?Spring Batch 数据库概论

Spring Batch提供了表初始化的语句,并支持了多种常见的数据库,我们可以在配置文件中设置 springbatchinitialize-schema 的值来指定对数据库的 *** 作。

embedded:如果不存在,创建一个空地库always:每次都重新创建新的库never:从不创建新的库默认的数据库文件地址在 /spring-batch-core-412RELEASEjar!/org/springframework/batch/core/schema-sql,根据不同的数据库类型,执行相应的脚本。

我们还可以通过 springbatchschema 指定SQL脚本的路径,通过 springbatchtable-prefix 设置数据库表的前缀,默认是BATCH_ 开头。

#设置schema脚本的路径springbatchschema=org/springframework/batch/core/schema-mysqlsql#设置表前缀springbatchtable-prefix=BATCH数据库表概论

执行完上边的脚本我们在数据库可以看到下边一个数据库表列表:

这些表可以分为三类:

JobInstanceBATCH_JOB_SEQBATCH_JOB_INSTANCEJobExecutionBATCH_JOB_EXECUTIONBATCH_JOB_EXECUTION_CONTEXTBATCH_JOB_EXECUTION_PARAMSBATCH_JOB_EXECUTION_SEQStepExecutionBATCH_STEP_EXECUTIONBATCH_STEP_EXECUTION_CONTEXTBATCH_JOB_EXECUTION_SEQ

数据库表详细介绍

BATCH_JOB_EXECUTION

job_execution_id: Job的执行ID,表主键version:当前记录被修改的次数,控制并发job_instance_id:Job 实例ID,同一个实例可能对应多条执行记录,但是一般只会对应一条执行成功记录,默认情况下JobName+参数 确定唯一的Job实例。create_time:记录创建时间start_time:Job开始执行时间end_time:Job结束执行时间status:执行状态exit_code:退出码exit_message:退出信息last_update:最后更新日期job_configuration_location:BATCH_JOB_EXECUTION_CONTEXT

Batch执行上下文,记录batch执行中放入的一些参数数据

以上就是关于spring JdbcTemplate批量插入 怎么获得数据库自动增长的id全部的内容,包括:spring JdbcTemplate批量插入 怎么获得数据库自动增长的id、springbatch批处理框架的简介、springbatch不读取process等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10165272.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存