【问题标题】:How can I release memory usage in apache camel?如何释放 apache camel 中的内存使用量?
【发布时间】:2020-02-05 04:56:13
【问题描述】:

全部。 我是骆驼的首发。 我有一些问题。

我有一种使用 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>

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    处理如此大量数据的最佳实践是批处理 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给大家具体演示

    【讨论】:

    • 感谢您的评论。我有另一个问题。当路由结束时,内存中获取的数据是否会在内存中消失?我想知道当交换和聚合数据在内存中释放时。
    • 内存占用是在当前处理完成时完成的。因此,在处理完所有批次之前,您的路线不会结束。拆分并在小卡盘中执行该处理只会减少内存占用以减轻 JVM。如果您想加快处理速度,您必须将并行流添加到您的路线中。
    • 我编辑了答案以添加类似问题的代码示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2014-04-18
    • 2012-06-02
    • 2010-09-16
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多