公司的一个微信项目用的是groovy语言,spring boot 开发的,架构师的选型果然跟一般企业运用架构不一样。数据库用的mongodb。mongodb一直只闻其名,他和nodejs是一对好搭档。不扯这么多了。
我遇到了一个真实的问题是,我接手做微信的后台管理,简直快疯了。因为做查询列表的时候,速度奇慢无比。后来我想到添加分页的方式,但是还是很慢,以至于我一直怀疑分页无效。
分析原因的时候,mongodb是用@DBRef来做关联的。百度了一下,貌似官方文档都怎么不推荐用这种方法的。同时我发现了有些用@DBRef还有@CacadeSave注解。人家添加了一个监听器,在mongo保存之前,同时把fiedl中的对象保存的。但是并没有存到Hazelcast分布式内存网格框架中。
因为我要查询的对象中包含着子对象,子对象又包含着子对象。而很多list中的对象,很多子对象有时相同的,没必要去查询mongodb。可以直接在缓存中获取,这样效率或许就会快多了吧。
官方文档里有这么一句话
Unless you have a compelling reason to use DBRefs, use manual references instead.
今天问了一下构架师关于mongodb的优化问题,他好像并没有提供实质性的建议,只是提供了一下方向。就是去掉DbRef的注解,还有就是用@Query注解。但是数据库中已经是用DbRef定义了。数据库中的表已经这样定义了。
我想到一种方法是用比较原生的api来处理。
MongoOperations是一个很强大的接口,有了这个接口,基本上什么都搞定了。
MongoOperations