You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Camel批量迁移PostgreSQL百万数据至MariaDB遇内存溢出求解决方案

Apache Camel批量迁移PostgreSQL到MariaDB内存优化方案

核心问题分析

你当前的路由会把PostgreSQL的全量数据一次性加载到内存,原因是SQL consumer端的batch=true参数仅表示将查询结果封装为一个List<Map>返回,并不会实现分批拉取数据。要处理百万级数据,必须从数据拉取和批量插入两个环节做优化。

具体解决步骤

  1. 开启SQL组件的流式查询
    在PostgreSQL的SQL端点添加streaming=true和batchSize参数,让Camel通过JDBC的流式ResultSet逐批次拉取数据,避免一次性加载全量数据到内存:

    from("sql:SELECT * FROM my_schema.trees?dataSource=#postgersqlDataSource&streaming=true&batchSize=1000")
    
    • streaming=true:启用JDBC流式查询,ResultSet不会一次性加载所有数据
    • batchSize=1000:指定每次从数据库拉取的记录数,可根据服务器内存调整(比如500、2000)
  2. 移除不必要的类型转换
    删除.convertBodyTo(String.class)步骤,这个操作会把整个结果集序列化为字符串,大幅增加内存占用,直接处理原始的List<Map<String, Object>>即可。

  3. 用SQL组件实现批量插入
    直接使用MariaDB的SQL端点完成批量插入,无需自定义process逻辑,Camel会自动按批次处理:

    from("sql:SELECT * FROM my_schema.trees?dataSource=#postgersqlDataSource&streaming=true&batchSize=1000")
        .log("Processing batch of ${body.size()} records")
        .to("sql:INSERT INTO maria_schema.trees (id, name, age) VALUES (#:#{body.id}, #:#{body.name}, #:#{body.age})?dataSource=#mariaDbDataSource&batch=true&batchSize=1000");
    
    • batch=true:在SQL producer端启用批量插入模式
    • 注意要保证插入语句的列和查询结果的字段名对应,避免字段不匹配问题
  4. 优化数据源配置
    给PostgreSQL数据源设置fetchSize,确保JDBC驱动每次从数据库拉取指定数量的记录,以HikariCP为例,在Spring Boot配置文件中添加:

    spring.datasource.hikari.connection-init-sql=SET fetch_size=1000
    
  5. 调整JVM内存参数
    在Spring Boot启动参数中增加内存配置,避免内存溢出,示例:

    -Xmx4g -Xms2g
    

    数值可根据服务器硬件配置调整,比如8核16G服务器可设置-Xmx8g。

验证效果

调整后,路由会每次拉取1000条记录,批量插入到MariaDB,处理完成后再拉取下一批,内存占用会维持在稳定水平,不会因百万级数据导致崩溃。

内容的提问来源于stack exchange,提问作者Shay Zambrovski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:10:29