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

如何使用带多线程的JdbcCursorItemReader从Oracle Db读取数据

龚国源
2023-03-14

我有spring批处理应用程序,配置步骤如下:

ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(4);
taskExecutor.setMaxPoolSize(10);
taskExecutor.afterPropertiesSet();
return this.stepBuilderFactory.get("step1")
            .<Mymodel, Mymodel>chunk(2500)              
            .reader(reader())
            .writer(writer())
            .taskExecutor(taskExecutor)
            .build();

像这样的读者:

@Bean
public JdbcCursorItemReader<Mymodel> reader() {
    JdbcCursorItemReader<Mymodel> reader = new JdbcCursorItemReader<Mymodel>();
    reader.setDataSource(dataSource);
    reader.setSql("select * from User");
    reader.setRowMapper(new BeanPropertyRowMapper<>(Mymodel.class));
    reader.setVerifyCursorPosition(false);
    return reader;
}

当我执行应用程序,得到这个错误:

组织。springframework。jdbc。UncategorizedSQLException:尝试处理下一行失败;SQL的未分类SQLException[select*from User];SQL状态[99999];错误代码[17289];最后一行之后的结果集;嵌套的例外是java。sql。SQLException:最后一行之后的结果集

你能帮我解决这个问题吗。

共有1个答案

淳于嘉树
2023-03-14

JdbcCursorItemReader不是线程安全的,因为它包装了一个不是线程安全的ResultSet对象。

您可以使用线程安全的JdbcPagingItemReader,并可选择配置页面大小以匹配块大小,以便在同一线程中处理每个页面。

更多细节见以下答案:https://stackoverflow.com/a/28724199/5019386.

希望这有帮助。

 类似资料:
  • 我正在创建一个int-redis:queue-inbound-channel-adapter,其中包含一个executor-task,pool-size=500和queue-capacity=0。 我不知道我做错了什么,也不知道我是否遗漏了什么。我很感激你的帮助。

  • 在我们的Java应用程序中,我需要从oracle数据库中读取8000万记录。我试图为此重新设计多线程程序。目前,我们使用Java5个线程池,10个线程基于主键模式并行读取数据库。每个线程将读取不同的模式,如001*和002*。 如何提高该计划的性能?我正在考虑设计模式,让引导线程读取数据库并将处理委托给子线程。在我们现有的设计中,不同的线程通过10个jdbc连接访问表。使用新方法,我将只有一个线程

  • 我正在编写一个简单的套接字编程应用程序,它使用一台服务器和一个客户端。我试图启动一个线程(从客户端文件中),从套接字输入流中读取输入,这样我就可以将消息写入服务器,同时读取并打印到屏幕上。然而,当我运行我的代码时,我的代码卡在 在< code>InputReader.java文件中,读取无输入? 我的代码如下,请帮忙。 简单服务器1.java SimpleClient1.java 输入读取器.ja

  • 我尝试使用spring batch从一个表中读取数据并写入其他表,但现在我的要求是从多个表中读取数据并写入一个文件,所以我们可以通过定义多个作业来实现这一点,但我想使用单个作业来实现,即单个读取器、单个写入器和单个处理器。 请为我提供一些关于这个场景的参考资料。

  • 问题内容: 我正在尝试将数据从一页传递到另一页。 www.mints.com?name=某物 如何使用JavaScript 阅读? 问题答案: 下面的a代码可以工作,并且在不可用的情况下仍然有用,但是它是在JavaScript中没有本机解决方案的时候编写的。在现代浏览器或Node.js中,更喜欢使用内置功能。 用法如下: 它返回一个像这样的对象: 所以 给

  • 本文向大家介绍利用Tensorflow的队列多线程读取数据方式,包括了利用Tensorflow的队列多线程读取数据方式的使用技巧和注意事项,需要的朋友参考一下 在tensorflow中,有三种方式输入数据 1. 利用feed_dict送入numpy数组 2. 利用队列从文件中直接读取数据 3. 预加载数据 其中第一种方式很常用,在tensorflow的MNIST训练源码中可以看到,通过feed_d