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

2019-08-20 23:46:34 +08:00
 NoKey
基于 springboot+mongodb 做一个系统
有一个场景,保存了全公司的员工信息( 3 万+)
定时会从 mysql 库同步员工信息,如果员工信息有改动(有一个版本号可以比较),mongodb 里就需要更新
但是。。。但是。。。我不知道到底哪个信息修改了
员工信息字段有几十个
如果要一个一个的比较,要写好多判断语句
然后,我找了 MongoTemplate 又一个方法 findAndReplace
但是,效率很低,测试一下,更新 1 万多人,需要 5 分钟左右(测试服务器),这段时间,用 robo 3T 工具去打开数据表,会卡住
哪位大佬知道,有没有更好更快速的方法呢?
谢谢
3468 次点击
所在节点    程序员
23 条回复
kkkkkrua
2019-08-21 00:15:39 +08:00
我曾经也考虑过类似的问题
如何系统的考虑修改字段的新值和旧值的记录,后面考虑了下,可以把记录做副本保存,再加上时间戳,对比的话只用对比最近的两个记录就行
缺点是数据比较大,算法如何实现,我还没落地。
Takamine
2019-08-21 00:18:43 +08:00
直接更新这个员工的全部数据快,还是找一遍更新某几个字段快。_(:з」∠)_
如果时效性要求不高,感觉可以丢到队列慢慢消费。
429463267
2019-08-21 00:24:54 +08:00
监控 mysql 执行日志,mysql 集群主从复制就是这个原理,读取 mysql 执行日志以后,转换成 mongodb 语法到 mongo 执行
luckylo
2019-08-21 07:57:21 +08:00
换个方式。你这是定时同步。假设你更新员工信息,就往消息队列里丢一个消息,mongodb 这个服务接收消息并更新员工信息,这样或许好一丢丢。
NoKey
2019-08-21 09:10:43 +08:00
@luckylo 谢谢回复。实际问题,就是无法这样,如果能这样,就没有我的问题了,现在的状况就是,只能在一定时间之后获取一次,而不能在每次有修改的时候,同步一下。这个一定时间之后,不可控,或许来一个较大的部门变动,就会涉及很多人。。。
wdmx007
2019-08-21 09:38:29 +08:00
用反射去对比字段可以少写判断 /手动滑稽
DsuineGP
2019-08-21 10:01:25 +08:00
javers 了解下
notreami
2019-08-21 10:19:51 +08:00
为啥要定时呢?准实时不行嘛?
mysql 数据有变动就发一个变更消息出来,直接更新 mongodb 不就可以了?
Kaiv2
2019-08-21 10:21:56 +08:00
时效性要求不高是不是可以弄个定时任务跑下
NoKey
2019-08-21 10:43:49 +08:00
@notreami 原来的服务已经写好了,不能动,所以无法再修改信息的时候给个消息过来😢
NoKey
2019-08-21 10:45:08 +08:00
@Kaiv2 就是定时任务,但是感觉更新的很慢
energetic
2019-08-21 10:47:44 +08:00
看起来你似乎用的是逐个更新的方法,建议试试先查出所有需要更新的员工信息,不用比较哪些字段变化,用 bulkOps 方法批量整体更新
liuhuansir
2019-08-21 10:49:06 +08:00
半夜跑定时任务,影响很小吧,慢点就慢点,5 分钟也还好吧?
NoKey
2019-08-21 11:15:35 +08:00
@liuhuansir 关键是为了更新效率性,又不能设置为半夜来跑,定时 2-3 小时跑一次,😓
NoKey
2019-08-21 11:17:53 +08:00
@energetic 谢谢回复,我看了一下 bulkOps 需要自己写一个 update,但是人员信息太多,得一个一个的过一遍才写的多 update,这个是很痛苦的。。。
Kaiv2
2019-08-21 11:35:46 +08:00
把数据分片处理下
br00k
2019-08-21 13:10:24 +08:00
这么点数据。实时性要求不高就按数据 update 时间定时同步就行了。实时性要求高就用 MQ。
artikle
2019-08-21 15:18:49 +08:00
定时任务+时间断点。
每 5 分钟或者 10 分钟跑一次脚本,去数据库拉取更新时间为,上一次时间断点到当前时间这一批次的所有数据 批量更新到 MongoDB,再将断点时间更新为当前时间。
ShellMings
2019-08-21 17:57:19 +08:00
其实你可以在 mysql 里新建一张和员工表一样结构的表,每次修改员工信息时那张表只存员工 id 和他修改过的字段,当然真正的员工表里的信息也要改,再加一个 lastEditTime 在新表里这样你就知道谁在什么时候改了些什么。
Juszoe
2019-08-21 19:38:02 +08:00
mysql 做个触发器,把更新的员工 id 放到新表中,记录更新时间,然后从这个表得知哪些被修改了,这样可以不?

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

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

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

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

© 2021 V2EX