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分钟.

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

总结

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

相关推荐
星辰徐哥11 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥11 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约11 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee11 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐11 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs11 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐11 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司11 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
一条小锦吕*11 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
Jinkxs11 小时前
Prometheus - 监控微服务:Spring Boot 应用指标暴露与监控
spring boot·微服务·prometheus