代码之家  ›  专栏  ›  技术社区  ›  Screwtape

camel jdbc streamlist查询似乎在拆分之前加载整个resultset

  •  0
  • Screwtape  · 技术社区  · 6 年前

    我正在运行一个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组件不会尝试缓存整个结果?

    1 回复  |  直到 6 年前
        1
  •  0
  •   skadya    6 年前

    StreamList 由于版本V.18.x,camel sql支持输出类型。在早期版本中,camel sql组件加载 result set in memory as list . 我认为在camel sql 2.17.x版本中这是不可避免的。

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

    Another related answer.