Как я могу освободить использование памяти у верблюда apache? - PullRequest
0 голосов
/ 05 февраля 2020

все. Я стартер для верблюда. У меня есть некоторые проблемы.

У меня есть один маршрут для вставки в таблицу с помощью sql. Этот маршрут запускается компонентом таймера.

Я хочу вставить запись 20 КБ. Итак, значение repeatCount установлено в 20000.

После того, как вся обработка завершена, я проверил использование памяти. Но память поддерживалась на высоком уровне использования.

Я знал, что вся используемая память будет инициализирована после обработки события.

Во время обработки использование памяти непрерывно увеличивалось и обработка заканчивалась, но память загрузка не упала.

Почему это происходит?

Файл маршрутизатора


<?xml version="1.0" encoding="UTF-8"?>
<routes id="TestRoutes" xmlns="http://camel.apache.org/schema/spring">
    <route id="testRoute1">
        <from id="_from1" uri="timer://timer1?period=1&amp;repeatCount=200000"/>
  <setBody>
   <constant>TEST Data!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</constant>
  </setBody>
  <to uri="sql:INSERT INTO temp_test(test1) VALUES(:#${body})"/>
    </route>
</routes>

1 Ответ

0 голосов
/ 05 февраля 2020

Наилучший метод обработки такого количества данных - это пакетирование SQL операторов.

Вместо одновременной обработки 20 тыс. Записей, разбейте их на небольшие фрагменты (партии).

Например, если:

 BATCH_SIZE = 100

Тогда вам нужно будет обработать 20 пакетов, поскольку количество всех записей равно 20000

Вам необходимо определить `AggregationStrategy 'для вашего SQL заявления и. Эта стратегия агрегирования будет использоваться методом aggregate ().

Вам также понадобится " batchSizePredicate ", который использует верблюда Predicate для фильтрации операторов по размеру пакета. Наконец, этот будет использоваться completionPredicate().

. Все эти функции могут дать маршрут, подобный следующему:

from("quartz2://myGroup/myTimerTransaction?cron=0+1+0+*+*+?")
.bean(QueryTool.class, "performQuery")
.to("direct:database-save");

from("direct:database-save")
                .log("Start saving to database ....")
                .aggregate(constant(true), batchAggregationStrategy())
                .completionPredicate(batchSizePredicate())
                .completionTimeout(BATCH_TIME_OUT)
                .bean(persistService)
                .log("End saving to database ....")
                .end();

, вы также должны определить completionTimeout, который сообщает, что произвольное время для завершения пакетного агрегирования.

Я бы также создал QueryTool.java класс, который выполнял бы SQL с JDB C запросами.

Вот общий пример , чтобы дать вам конкретную демонстрацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...