请教大佬, springboot+mongodb 如何效率的更新整个实体类

2019-08-20 23:46:34 +08:00
 NoKey
基于 springboot+mongodb 做一个系统
有一个场景,保存了全公司的员工信息( 3 万+)
定时会从 mysql 库同步员工信息,如果员工信息有改动(有一个版本号可以比较),mongodb 里就需要更新
但是。。。但是。。。我不知道到底哪个信息修改了
员工信息字段有几十个
如果要一个一个的比较,要写好多判断语句
然后,我找了 MongoTemplate 又一个方法 findAndReplace
但是,效率很低,测试一下,更新 1 万多人,需要 5 分钟左右(测试服务器),这段时间,用 robo 3T 工具去打开数据表,会卡住
哪位大佬知道,有没有更好更快速的方法呢?
谢谢
3212 次点击
所在节点    程序员
23 条回复
TestCode
2019-08-21 21:24:37 +08:00
我觉得这样比较好,数据库那头用一个触发器,一旦有员工信息修改便将修改相关信息放入消息队列,另一端消费。
LeeSeoung
2019-08-22 10:11:27 +08:00
"员工信息字段有几十个
如果要一个一个的比较,要写好多判断语句"

mysql 跟 mongodb 分别取回来的实体类 自己写一个反射遍历所有成员进行比对,很容易得到差异点吧,可以写成通用的,并不需要一个一个写。
wxb2dyj
2020-03-18 21:42:39 +08:00
以下是我的方法

//CommonUtil.java
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
....
public static void copyNonNullProperties(Object src, Object target) {
BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
}

private static String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (PropertyDescriptor pd : pds) {
String propertyName = pd.getName();
Object srcValue = src.getPropertyValue(propertyName);
if (srcValue == null) {
emptyNames.add(pd.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}

//获取新 /旧员工信息,newEmployee 是新的员工信息,originalEmployee 是旧的员工信息
Employee originalEmployee = readFromYourMongoDB();
Employee newEmployee = readFromYourMySQL();
//该方法将会更新 originalEntity,而且只更新相对 newEntity 中变化的字段
CommonUtil.copyNonNullProperties(newEmployee , originalEmployee );
//重新保存 originalEmployee 到 MongoDB
ObjectId objectId = new ObjectId();
Date date = objectId.getDate();
//保存更新时间
originalEmployee.setUpdateTime(objectId.getDate());
employeeRepository.save(originalEmployee);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/593674

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX