全部。 我是骆驼的入门者。 我有问题。
我有一条使用sql插入表的途径。 此路由由计时器组件触发。
我要插入20k条记录。因此,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&repeatCount=200000"/>
<setBody>
<constant>TEST Data!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</constant>
</setBody>
<to uri="sql:INSERT INTO temp_test(test1) VALUES(:#${body})"/>
</route>
</routes>
答案 0 :(得分:0)
处理此类数据的最佳实践是批处理SQL语句。
与其一次处理20k条记录,不如将它们分成小块(批量)。
例如,如果:
BATCH_SIZE = 100
然后,由于所有记录数均为20
,因此您将不得不处理20000
批处理
您需要为SQL语句和定义一个“ AggregationStrategy”。该聚合策略将由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
类,该类将通过JDBC查询执行SQL。
这里是general example,给您具体的演示