Наилучший метод обработки такого количества данных - это пакетирование 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 запросами.
Вот общий пример , чтобы дать вам конкретную демонстрацию