Я использую потребитель 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 кешировать все результаты?