java - StoredProcedureItemReader 和 JdbcCursorItemReader 的游标数据保留在 java 堆内存中还是数据库中

标签 java spring spring-data spring-batch

在 Spring-batch 中,通常当我们使用任何 itemreader 时,它会在每次调用 read 方法时获取每一行,并且一旦等于提交间隔,它就会将数据发送到 writer。

我已经读到 StoredProcedureItemReader 和 JdbcCursorItemReader 是基于游标的阅读器,一旦执行查询,数据就在游标中,并且读取方法在每次调用中都会进入行。

但是,我的问题是这个游标驻留在 java 内存或数据库中:- 1.如果它一次获取java内存中的所有数据,那么批处理的优势是什么,因为应用程序将有可能变慢或内存不足。 2. 如果它在数据库中的某个位置,则 Storeprocedor 或 JDBC 连接本身将计时,直到所有记录都在处理中获取。

我试图找到答案,但在文档中没有找到任何地方,也不知道自己测试一下才能确定。 我对我来说似乎很重要,好像有些人要使用这些阅读器,他们需要增加连接超时或者需要更多的堆内存。

最佳答案

是的,使用 StoredProcedureItemReader,可以获取整个批处理。这是因为许多驱动程序(包括一些 Oracle 的驱动程序)不支持批处理 CallableStatements。有些人会失败,有些人会默默地忽略你。因此,为了保持一致,Spring Batch 根本不允许对存储过程进行批处理。

某些数据库驱动程序(例如 IBM Informix 驱动程序)允许根据连接字符串中的参数进行自动批处理;换句话说,如果可能的话,它会进行批处理,而无需显式控制它,但有一些注意事项。如果在您的用例中,您绝对需要批处理存储过程并且不想编写自定义 ItemReader 或 ItemWriter,那么这可能是您的一个选择。

关于java - StoredProcedureItemReader 和 JdbcCursorItemReader 的游标数据保留在 java 堆内存中还是数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27385540/

相关文章:

Java SWT : How to set the window to be resizable\not resizable on the fly?

java - Apache James Spring 发行版未启动

java - 如何解决Spring Security无需登录即可访问url的问题

java - JPA 2 : Referential integrity constraint violation while saving entity with undirectional OneToMany relationship

java - PDFBOX 2.0 : How can I scale large page sizes to letter?

java - 为什么 Hibernate JPA 在使用 getReference() 时抛出 LazyInitialization 异常?

java - 线程中出现异常 "AWT-EventQueue-1"java.lang.NullPointerException 错误

spring - 创建名为 'sqlSessionFactory' 的 bean 时出错...调用 init 方法失败;嵌套异常是 java.lang.NullPointerException

java - 如何使用spring实现lazy db数据获取

java - spring-data-cassandra 未找到 UserDefinedType