使用spring data template 操作mongodb的时候,忘记 在实体上加 注解@Document 导致查询全文搜索,导致mongodb cpu 飙高,用户登陆卡死。
早上客服反映无法正常登陆,我马上想到查询服务器后台日志,发现mongodb 查询超时,不断的打印错误到日志。
于是,我停掉了查询日志的统计进程。再看Java 后台打印,发现 linux top 命令 发现 mongodb cpu 仍然再17~60%之间徘徊,显然不是这个问题。我判断
是查询慢导致的卡顿,所以百度搜索了一下mongodb 慢查询。。。。。。
除了再启动服务器的时候 设置相关参数(服务器正在运行,不可能重启),还可以通过再连接客户端进行设置(这下好了)。打开robo 3t 找到数据 执行db.setProfilingLevel(1) 开启慢查询,在我的数据下出现了 system 文件夹,system 下自动创建了"system.profile"的 collecion ,打开表我看到 慢查询的 内容
{
"op" : "query",
"ns" : "xx.xxxx",
"query" : {
"find" : "xxxxx",
"filter" : {
"state" : 1,
"userId" : "xxxxx"
}
},................................等
问题找到了,在项目里找到xxxx 实体类,由于加班赶工期,忘记在实体上标记 @Document ,字段上标记的索引都没有生效。 查询的时候 进行了全文搜索。。。。。。。
给实体加上注解。本地启动进程连接远程库,神奇的发现,并没有自动创建索引!
难道spring 骗我不成?。。。。。。。。。。。。。。。。。先冷静一下。我决定在本地库上试试, 这个实体对应的表,在启动服务器后, 插入一条数据,索引生成了。再次用java 连接远程库,启动服务器的监听 插入一条数据到 指定的 表中,问题解决。
总结一下, 使用spring 操作数据库的时候,不要忘记 @Document 注解 ,慢查询可以帮助我们很快的定位 哪个查询很慢; 冷静思考,哪怕有人在旁边催你,可能错误就是一个低级错误。