Появляется запрос Camel JDBC StreamList для загрузки всего набора результатов перед разделением - PullRequest
0 голосов
/ 12 декабря 2018

Я использую потребитель SQL для чтения изменений из таблицы, и это хорошо.Однако бывают случаи, когда происходят массовые изменения, а затем мой запрос прерывается с ошибкой нехватки памяти, как и следовало ожидать.

К сожалению, я застрял на верблюде 2.17.6, поэтому опция StreamList длякомпонент SQL недоступен.(Хотя в соответствии с 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");

Я сделалИзначально у меня была стратегия агрегации UseLatestAggregationStrategy и дополнительный шаг после split(), но я удалил это в попытке удалить все, что могло бы привести к тому, что весь запрос был сохранен в памяти, но я не вижу, чтоиначе я могу сделать это сейчас.

Я отмечаю, что вопрос верблюд jdbc из-за исключения памяти поднимает аналогичную проблему и, похоже, не имеет разрешения.

(Я должен отметить, что ошибки нехватки памяти, которые у меня были, появляются в разных местах и ​​включают GC overhead limit exceeded в WinNTFileSystem, что я не понимаю, и что-то еще, связанное с ZippedInputStream, что опять же не японять.)

Означает ли это, что StreamList также не работает на компоненте JDBC, или мне нужно сделать что-то конкретное, чтобы компонент JDBC не пыталсяo кешировать все результаты?

1 Ответ

0 голосов
/ 29 декабря 2018

StreamList тип вывода поддерживается в camel-sql начиная с версии v.18.x.В более ранней версии компонент camel-sql загружал набор результатов в память в виде списка .Я не думаю, что этого можно избежать в Camel-SQL версии 2.17.x.

Агрегирование / разбиение применяется после загрузки результата в память компонентом Camel-SQL.

Еще один связанный ответ.

...