我正在编写弹簧批次,该弹簧批次从平面文件中读取,很少处理并将摘要写入输出文件.与读者相比,我的处理器和作家相对较快.我正在使用FlatFileItemReader,并尝试从50-1000开始进行广泛的提交间隔.我的批处理工作必须以更快的速度处理100亿记录.请让我知道提高FlatFileItemReader速度速度的方法.粘贴在我的配置文件下方,我的映射类别读取字段集并将值设置为POJO bean.非常感谢. batchfileconfig.xml
以下是关于 spring-batch 的编程技术问答
我需要在批处理程序中获得理想数量的线程,该线程以支持并行模式的批处理框架运行,例如弹簧批处理中的并行步骤. 据我所知,有太多线程无法执行程序的步骤,这可能对程序的性能产生负面影响,这不是很好.可能会出现一些因素绩效退化(上下文切换,使用共享资源时的种族条件(锁定,同步..)...(还有其他因素吗?). 当然,获得理想的线程数的最佳方法是让我进行实际程序测试来调整程序的线程数.但是在我的情况下,进行实际测试并不容易,因为测试(人员,测试计划,测试数据等)需要许多事情,这对我来说太难了.因此,在获得实际测试之前,我想知道尽可能最好地获得程序中理想数量的线程数量的理想数量. 我应该考虑如何获得程序的理想线程数(步骤)? CPU内核数?我程序将运行的机器上的流程数量?数据库连接的数量? 在这种情况下,是否有一种理性方式,例如公式? 解决方案 最重要的考虑因素是您的应用程序/计算是由CPU结合还是结合IO. 如果它是IO-BOND(单个线程的大部分时间都在等待外部eSourc
我有一个在VM中运行的春季批处理应用程序,需要2个小时才能处理10K记录. 我们计划将应用程序迁移到Azure Kubernetes,我看到迁移的应用程序需要6个小时. 我需要进行必要的更改以满足当前的性能. 我们没有对代码进行任何重大更改. 如何进行分析以分析Intellij中的性能问题?还有其他方法可以找到造成绩效影响的原因吗? 注意:我没有appdynamic. 解决方案 这个问题本身并不是真正特定于Spring Batch本身,但是如果要使用Intellij Idea介绍Java应用程序,则可以从IDE(或IDE之外)运行该应用程序并附上Profiller向此,请参阅您也可以使用开源探索器,请参阅开源源java profilers .
背景 我目前有一个弹簧批量的作业,读取一个平面文件.该作业使用MultiResourcePartitioner读取已分为n个较小文件的文件的物理分区.这意味着文件的每个物理分区将导致执行读取分区的新从属步骤. 问题 如果有任何问题读取任何物理分区,则该从步骤的执行将失败,并且春季批次将记录例外.这不会影响读取文件不同物理分区的其余从属步骤的执行;但是,这不是所需的行为.我想要的是,如果有问题阅读特定的物理分区(例如:无法解析特定列),则应将异常传播到启动Job的位置,以便我可以进一步停止加工. Job的位置,也无法停止执行其余的从属步骤. 如何使Spring Batch传播到从从阶段一直到启动Job的位置的任何例外?我想这样做,以便我可以在处理任何一个分区文件的问题上停止任何进一步的处理. 解决方案 如果有任何问题读取任何物理分区,则该从步骤的执行将失败,并且春季批次将记录例外.这不会影响读取文件不同物理分区的其余从属步骤的执行;但是,这不是所需
spring batch docs 作业存储库: 请注意,内存存储库是挥发性的,因此不允许在JVM实例之间重新启动.它还不能保证同时启动具有相同参数的两个作业实例,并且不适用于多线程作业或本地分区的步骤.因此,无论您在哪里需要这些功能,请使用存储库的数据库版本. 我想使用地图作业存储库,并且我不在乎重新启动,预防并行的工作执行等.但是我 do 关心能够使用多线程和本地分区. 我的批处理应用程序有一些分区的步骤,乍一看,它似乎可以使用一个MAP支持的作业存储库运行. mapjobrepositoryfactorybean无法说什么是什么原因?查看MAP DAOS的实现,他们正在使用ConcurrentHashMap.这不是线程安全吗? 解决方案 我建议您遵循文档,而不是依靠实施详细信息.即使地图是单独的线程安全的,也可能存在变化的种族条件,而不是涉及这些地图之一. 您可以非常轻松地使用内存数据库.示例 @Grapes([ @Gra
我正在尝试与分区者一起学习春季批次. 问题是我需要从分区者实现中动态设置文件名.我正在尝试在itemReader中获得它.但是它给出了文件名 null . 我的春季批处理配置: @Bean @StepScope public ItemReader itemReader(@Value("#{stepExecutionContext[filename]}") String filename) throws UnexpectedInputException, ParseException { FlatFileItemReader reader = new FlatFileItemReader(); DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); String[] tokens = {
我写了两个步骤的工作,其中两个步骤之一是分区步骤. 分区步骤使用TaskexecutorPartitionHandler,并在线程中运行5个从步骤. 该作业以main()方法开始.但是,在每个从属项目Reader返回null-完成符号之后,它并没有停止.即使程序在Main()方法(即System.out.println("完成"))中的最后一行代码之后,程序过程也不会停止,悬挂在内存中而无需做任何事情.我必须按Eclipse面板上的停止按钮以停止程序. 以下是Joblauncher.run()返回的Jobexecution的内容,发出了工作的成功状态. Jobexecution:ID = 0,版本= 2,starttime =星期五NOV 27 06:05:23 CST 2015,ENDTIME = FRI NOV 27 NOV 27 06:05:39 CST 2015,lastupdated = fri Nov 27 06:05:39 CST CST 2015,状态=已完成
我需要将自定义对象发送到弹簧批处理作业,在该作业中,项目处理器不断使用该对象来用于业务需求. 我们如何将自定义对象从外部发送到作业上下文.此对象因业务案例而变化,并在运行时生成. 如何将其作为作业参数发送?还是有什么方法可以将此对象设置为相应的作业? 覆盖春季工作参数能以任何方式帮助我吗?还是有任何大问题作为这种压倒性行为的结果? 解决方案 使用下面的类发送自定义. public static class CustomJobParameter extends JobParameter { private T customParam; public CustomJobParameter(T customParam){ super(UUID.randomUUID().toString());//This is to avoid duplicate JobIn
我是春季批次的新手,无法弄清楚如何做到. 基本上,我有一个弹簧文件投机器,每n分钟运行一次,以在某些目录中查找具有某些名称(例如:a.txt&b.txt)的文件.在任何时候,此目录中可能有最大2个文件(A和B).通过春季批处理作业,这两个文件将被处理并持续到2个不同的DB表. 这些文件有些相似,因此使用了相同的处理器/作者. 现在我设置的方式,每个投票周期1文件都被拾取并运行. 假设目录中有2个文件(a.txt和b.txt),有没有办法创建2个作业,以便可以并行运行两个作业? 解决方案 我相信您可以.由于您是春季批处理的新手(就像我一样),我建议您通过批次的域语言如果您还没有这样做. 然后,您可以开始配置自己的异步 JobLauncher.例如: @Bean public JobLauncher jobLauncher() throws Exception { SimpleJobLauncher jobLauncher =
我们有简单的批处理过程,这些过程正常.最近,我们有了新的REQMNT来实施新的批处理流程来生成报告.我们有数据源用于阅读以准备此报告.具体来说,我们可能对每个报告都有一个视图. 现在,我们想以这样的方式扩展此过程,以使其可以尽早进行缩放和完成. 我熟悉多线程步骤,但不确定其他策略(远程块和分区步骤),以及当时使用哪个策略. 在我们的案例处理中 +写入文件是更多的资源激励措施,然后再阅读. 在这种方法中,方法最适合. ,或者如果我们发现从数据库中读取数据是与写入 +处理要文件相同的资源激励措施,那么我们必须改进/缩放此过程的最佳选择. 解决方案 tldr; 根据您的描述,我认为您可以尝试使用同步读取器进行多线程步骤,因为您提到处理和写作是您步骤更昂贵的部分. 但是,看到您的读者是数据库,我认为配置了分区的步骤,并且工作将非常有益.设置需要更多的工作,但从长远来看会更好. 多线程H2> 使用: 加快个人步骤 当读者(即JMS或
我在应用程序中使用Spring + Hibernate + JPA. 我需要阅读Websphere MQ的消息,然后将消息插入DB. 有时可能会有连续的消息,有时会有很少的消息,有时我们可以期望Queue> 的消息. 目前,我正在一一读取消息,然后将它们插入数据库.但这在性能方面没有太大帮助. 我的意思是,当我有大量消息(示例300K消息)时,我无法更快地插入它们.插入到DB每秒的实体数量不是那么高.因为我确实致力于每个实体. 我想使用Hibernate批处理处理,以便可以在单个提交中插入实体列表. (示例:每个提交30至40条消息) 问题: 如何从队列接收多个消息? (我已经检查了batchMessagelistenerContainer可能会有所帮助.但是我无法获得一些参考) 我是否应该将DB插入过程分离出侧面方法?因此,该线程将被释放到池并可以从队列中挑选下一条消息? 并行线程使用? 当前实现: 消息侦听器:
我最近从Spring-Boot/Spring-Framework(分别)迁移了我的Spring Boot/批次Java应用程序(分别)1.x.x/4.x.x到=> 2.x.x/5.x.x(2.2.4/5.2.3请明确点).问题是(我认为)与交易/实体管理器一起肯定是错误的,就像从我的数据库持久性层的.saveAll()方法中调用.saveAll()方法时,它跳入Springaop框架/libarary代码和进入无限循环.我看到它从方法(Invoke())返回" Defaultransaction"对象.我的应用程序在1.x.x/4.x.x上工作时,将返回我实体的实际arraylist.我正在使用spring-boot-starter,spring-boot-starter-web,spring-boot-starter-data-jpa,spring-boot-starter-batch和hibernate/hibernate-envers/hibernate-entitymanager
问题 当我开始使用单独的线程同时运行相同的作业时,正在发生必须插入,处理时必须插入的记录,从作者插入.进入数据库.当我同时运行两组数据时,该批次运行正确: 记录已处理的数据集1:3606(预期3606). 记录已处理的数据集2:1776(预期1776). 如下图所示,春季批次读取和编写的记录数量如预期: 上下文 在这个项目中,我将MySQL用作数据库和Hibernate. 一些代码 批处理配置,作业和步骤 @Configuration @EnableBatchProcessing public class BatchConfig extends DefaultBatchConfigurer { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFa
我正在使用Spring Boot和Hiberna创建春季批处理作业,但在插入过程中我遇到了问题.这是代码的相关部分: @Bean public JdbcBatchItemWriter writer(DataSource dataSource) throws SQLException { return new JdbcBatchItemWriterBuilder() .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()) .sql("INSERT INTO OphthalmicLens (`createdBy`,`createdDate`,`lastModifiedBy`,`lastModifiedDate`,`sid`,`