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

时间:2014-12-09 17:53:48

标签: java spring spring-data spring-batch

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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