骆驼JDBC StreamList查询似乎在拆分之前加载了整个结果集

时间:2018-12-12 09:58:16

标签: sql-server jdbc apache-camel

我正在运行一个SQL使用者以读取表中的更改,这一切都很好。但是,在某些情况下,质量会发生大量变化,然后我的查询会因为内存不足错误而中断,正如您所期望的那样。

不幸的是,我坚持使用Camel 2.17.6,因此SQL组件的StreamList选项不可用。 (尽管根据Camel-SQL Why using StreamList seems to load all ResultSet?,由于Spring JDBC的限制,它不能作为流列表使用。)

因此,我已经使用支持流列表的JDBC组件重新编写了路由,并且一旦增加要提取的记录数量,我仍然会遇到内存异常。看来出于某种原因,JDBC组件试图在将所有记录传递到拆分器之前提取所有记录。

我现在所拥有的是以下形式:

from("timer:timer...")
  .to( "language:constant:resource:classpath:pathToSqlStatement/sqlStatement.sql" )
  .to( "jdbc:msSqlServerDataSource?outputType=StreamList" )
  .split( body() ).streaming()
  .setBody().simple("$body[XMLDOC]")
  .setHeader("HeaderName").xpath("xpath/to/data")
  .to("jms:topic:name");

我本来确实有一个聚合策略UseLatestAggregationStrategy,并且在split()之后又做了一个额外的步骤,但是我将其删除了,试图删除所有可能导致整个查询都保留在其中的内容。记忆,但是我看不到我现在还能做些什么。

我注意到问题camel jdbc out of memory exception提出了类似的问题,并且似乎没有解决办法。

(我应该注意的是,我曾经遇到的内存不足错误出现在不同的位置,并且在GC overhead limit exceeded中包含了WinNTFileSystem我不理解,并且与ZippedInputStream,我也不明白。)

这是否意味着StreamList不能在JDBC组件上运行,还是我必须做一些特定的事情以确保JDBC组件不会尝试缓存整个结果?

1 个答案:

答案 0 :(得分:0)

从v.18.x版本开始,camel-sql支持

StreamList输出类型。在早期版本中,camel-sql组件加载result set in memory as list。我认为在camel-sql 2.17.x版中无法避免。

通过骆驼SQL组件将结果加载到内存中后,聚合/拆分确实适用。

Another related answer.