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

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

总结

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

相关推荐
XDHCOM21 小时前
ORA-32484重复列名错误,ORACLE数据库CYCLE子句故障修复与远程处理方案
数据库·oracle
swg32132121 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
翻斗包菜21 小时前
PostgreSQL 日常维护完全指南:从基础操作到高级运维
运维·数据库·postgresql
gelald21 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
@yanyu66621 小时前
07-引入element布局及spring boot完善后端
javascript·vue.js·spring boot
呆瑜nuage21 小时前
MySQL表约束详解:8大核心约束实战指南
数据库·mysql
liliangcsdn21 小时前
Agent Memory智能体记忆系统的示例分析
数据库·人工智能·全文检索
那个失眠的夜21 小时前
Mybatis延迟加载策略
xml·java·数据库·maven·mybatis
Rick199321 小时前
SQL 执行流程
数据库·sql
M--Y21 小时前
Redis常用数据类型
数据结构·数据库·redis