【问题标题】:Is cursor data remain in java heap memory or in database for StoredProcedureItemReader and JdbcCursorItemReader游标数据是否保留在 Java 堆内存中或 StoredProcedureItemReader 和 JdbcCursorItemReader 的数据库中
【发布时间】:2014-12-09 17:53:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 欢迎提出改进问题的版本或任何测试方法,我想自己测试

标签: java spring spring-data spring-batch


【解决方案1】:

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

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

【讨论】:

  • 所以在整个过程中所有数据都将驻留在我的java堆内存中:-(。顺便说一下我正在使用db2
  • 是的,它会的。我在 JDBC 文档中找不到连接字符串的参数,但您也许可以在 Google 上找到它。我不确定它在 DB2 下是否有效。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 2016-11-11
  • 2020-11-23
  • 1970-01-01
  • 2010-10-22
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多