如何释放Apache骆驼中的内存使用情况?

时间:2020-02-05 04:56:13

标签: java apache-camel

全部。 我是骆驼的入门者。 我有问题。

我有一条使用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&amp;repeatCount=200000"/>
  <setBody>
   <constant>TEST Data!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!</constant>
  </setBody>
  <to uri="sql:INSERT INTO temp_test(test1) VALUES(:#${body})"/>
    </route>
</routes>

1 个答案:

答案 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,给您具体的演示

相关问题