我正在运行一个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组件不会尝试缓存整个结果?
答案 0 :(得分:0)
StreamList
输出类型。在早期版本中,camel-sql组件加载result set in memory as list。我认为在camel-sql 2.17.x版中无法避免。
通过骆驼SQL组件将结果加载到内存中后,聚合/拆分确实适用。