我正在运行一个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提出了一个类似的问题,并且似乎没有解决方案。
(我应该注意到,我遇到的内存不足错误确实出现在不同的地方,包括WinNTFileSystem
处的GC overhead limit exceeded
,我不明白,以及与ZippedInputStream有关的其他错误,我也不明白。)
这是否意味着StreamList也不能在JDBC组件上工作,或者我必须做一些特定的事情来确保JDBC组件不会尝试缓存整个结果?
2条答案
按热度按时间z9smfwbn1#
camel-sql从v.18.x版本开始支持
StreamList
输出类型。在早期版本中,camel-sql组件将结果集作为列表加载到内存中。我认为在camel-sql 2.17.x版本中无法避免。在camel-sql组件将结果加载到内存中后,聚合/拆分不适用。
Another related answer.
mfpqipee2#
我在使用postgres时也遇到过类似的问题,但是将transacted放在jdbc查询前面解决了我的问题。
问题的原因是postgres的autocommit标志必须为false才能得到流结果。在camel路由中,唯一的方法似乎是将transacted放在调用前面。