SpringBoot 数据库同步 Elasticsearch 性能优化

文章目录

前言

系统引入 Elasticsearch 来支持更高效的查询场景 (以下简称 ES). 就需要将数据库数据同步到 ES 中. 方案选择是分批从 DB 中读取数据再分批写入ES 中.


一、原始实现

java 复制代码
读取:
for (int i = 0; i < times; i ++) {
    List<Order> saleList = salesDataGateway.batchList(query);
    writeEsKit.doWrite(saleList);
    query.setStartIndex(maxid + 1);
}

public class Order implements Serializable {
    @JsonProperty("geo_cd")
    private String geoCd;
    @JsonProperty("fiscal_year")
    private String fiscalYear;
}

写入ES : 
 BulkRequest bulk = new BulkRequest();
 bulk.timeout(timeOut);
 for (Order item : saleList) {
     bulk.add(new IndexRequest(indexName)
     .id(item.getOrderId())
     .source(JsonUtil.object2Json(item), XContentType.JSON));
 }
 Client.bulk(bulk);
c 复制代码
这段代码平稳运行了一年多,一张 index 最多要写入 500 多万数据,耗时约 2 小时. 
因为一条订单 260 多个字段,所以大家也都觉得就得这么长时间.汇报得时候也理直气壮. 

二、总觉得哪里不对劲?

c 复制代码
总觉得这里怪怪的. 
代码逻辑先从数据库查出数据.又使用 @JsonProperty 来命名转换. 最后格式化为 JSON 写入.  
而格式化这个操作在处理大实体类时是有性能损耗的.
所以我想是不是可以有别的方式. 比如去掉中间商赚差价....
java 复制代码
for (int i = 0; i < times; i ++) {
    List<HashMap<String, Object>> saleList = salesDataGateway.batchListMap(query);
    writeEsKit.doWrite(saleList);
    query.setStartIndex(maxid + 1);
}

 BulkRequest bulk = new BulkRequest();
 bulk.timeout(timeOut);
 for (HashMap<String, Object> item : saleList) {
     bulk.add(new IndexRequest(indexName)
     .id(item.getOrderId())
     .source(item));
 }

三、 意想不到的收获

c 复制代码
ES 支持Map 写入.所以拿的就是Map,写入同样是Map. 不兜圈子直接搞. 写入耗时从2小时直接缩短到29分钟.

觉得它耗时?没想到它这么耗时!!

总结

为领导跟老板汇报提供了素材.

相关推荐
huaweichenai9 小时前
spring boot对接阿里短信
java·spring boot
马剑威(威哥爱编程)9 小时前
【AI全栈后端12-08】Spring Boot 用 MCP 统一接入内部系统:让 AI 接一次,全公司复用
java·人工智能·spring boot
顽疲9 小时前
从零用 Java 实现小红书 SpringBoot Vue UniApp(23)笔记话题多对多:一条笔记进多个话题池
java·vue.js·spring boot
姜鱼问生9 小时前
docker exec 排查容器问题:从日志到进程
运维·网络·数据库·docker·容器
做个文艺程序员9 小时前
MQ第02篇:RabbitMQ快速上手教程:AMQP模型详解+Spring Boot整合实战(附完整代码)
spring boot·消息队列·rabbitmq·java-rabbitmq·amqp
RuoyiOffice9 小时前
SpringBoot3 企业定时结算架构:考勤日结、合同到期、库存预警与财务结转如何可靠执行
spring boot·xxl-job·定时任务·分布式任务·spring boot 3·幂等设计·ruoyi office
狗凯之家源码网10 小时前
AI 步数修改提交系统源码应用场景与落地指南
android·数据库·人工智能·运动步数
穆梓兰煊10 小时前
AI供应链安全不再只是包安全,还涉及模型与数据
前端·数据库
北风toto10 小时前
数据库笔记:Armstrong 公理系统与集合论的深度辨析
数据库·笔记