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

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

总结

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

相关推荐
Decay__2 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
小徐不徐说6 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
Eloudy7 小时前
Qwen2.5-14B-Instruct-AWQ 模型文件结构分析
大数据·elasticsearch·搜索引擎
Decay__8 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构
字节探索9 小时前
Spring Boot 接口幂等性设计:从唯一索引到 Redis+Lua 的工程实践
java·spring boot
胡写代码9 小时前
删掉的数据还占着唯一键:逻辑删除 + 唯一索引的四次取舍
spring boot·后端