当前位置: 首页 > 知识库问答 >
问题:

Camel JDBC StreamList查询似乎会在拆分之前加载整个结果集

桂浩言
2023-03-14

我正在运行一个SQL消费者来读取表中的更改,这很好。然而,有时更改会大量发生,然后我的查询会因为内存溢出错误而中断,这可能是你所期望的。

不幸的是,我被困在Camel 2.17.6上,因此SQL组件的StreamList选项不可用。(尽管根据Camel SQL,为什么使用StreamList似乎会加载所有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");

我最初有一个聚合策略uselateStaggegationStrategy,在split()之后还有一个额外的步骤,但我已经去掉了它,试图删除可能导致整个查询被保存在内存中的所有内容,但我看不出现在还能做什么。

我注意到,camel jdbc内存不足异常引发了类似的问题,而且似乎没有解决方案

(我应该注意到,我遇到的内存不足错误确实出现在不同的地方,包括GC开销限制超出了WinNTFileSystem,我不理解,还有一些与ZippedInputStream有关的错误,我也不理解。)

这是否意味着StreamList也不能在JDBC组件上工作,或者我必须做一些特定的事情来确保JDBC组件不会试图缓存整个结果?


共有2个答案

陶智
2023-03-14

我在postgres上也有类似的问题,但将Transaction放在jdbc查询前面解决了我的问题。

问题的原因是,对于postgres,自动提交标志必须为false才能获得流式结果。在骆驼路线内,唯一的办法似乎是把Transaction放在电话前面。

凌俊名
2023-03-14

从v.18. x版本开始,camel-sql支持输出类型。在早期版本中,camel-sql组件将结果集作为列表加载到内存中。我认为在2.17. x版本中无法避免。

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

另一个相关的答案。

 类似资料:
  • 我正在尝试运行一个in查询(springboot jpa mysql)。我已经启用了调试日志,查询似乎很好,但是SpringJPA没有返回任何结果。 以下是配置: 这是我的存储库: //或 这里需要注意的是,“in”查询中的列不是主键。 生成的查询:

  • 我正在使用散列键查询DynamoDB表。表中的每个记录都由散列键和范围键唯一标识 当结果集大于1MB时,如何检索其余的。我找不到任何方法来获取文档中提到的。

  • 我有两种型号: 用户 用户有很多帖子。帖子有很多评论,评论属于帖子。这很简单。 现在我想加载所有的帖子的认证用户与它的评论,如果帖子有评论今天创建。如果帖子今天没有评论,它将不会被加载。这些帖子也将被分页。如何建立查询在laravel雄辩? 我试过这样的方法:

  • 问题内容: 我有一个查询。现在,此查询当然返回一个结果集,我想要的是查询此查询的结果集,例如,我只希望上述查询具有唯一的名称。我应该提一下,我知道我可以在Query1中使用,但这只是一个示例,我的实际情况有些不同,我想知道的是是否可以查询上一个查询的结果集。我正在使用SQL Server 2012。 问题答案: 您可以使用该子句

  • 问题内容: 我在使用VBA执行SQL查询并将结果复制到Excel工作表时遇到问题。 子执行时,它仅复制256的倍数的行(因此,只有256、512、768等行是填充到Excel中的行)。我从数据库中复制任何其他字段都没有问题。另外,当我在MySQL中运行相同的查询时,它也可以正常工作。对于SQL和VBA来说都是相当新的东西,我看不到任何原因导致此特定字段引起麻烦。我唯一能想到的是它的内容是一个始终以

  • 查询结果的重打分 有些应用场景中,对查询语句的结果文档进行重新打分是很有必要的。重新打分的原因可能会各不相同。其中的一个原因可能是出于性能的考虑,比如,对整个有序的结果集进行重排序开销会很大,通常就会只对结果集的子集进行处理。可以想象重打分在业务中应用会相当广泛。接下来了解一下这项功能,学习如何将它应用在业务中。 理解重打分 在ElasticSearch中,重打分是一个对限定数目的查询结果进行再次