我正在运行一个sql使用者来读取表中的更改,这一切都很好。但是,有时会在mass上发生更改,然后我的查询会因内存不足错误而中断,正如您所料。
不幸的是,我被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组件不会尝试缓存整个结果?