将SpringData MongoDB从1.6.1更新到1.7.0后,我遇到了性能问题。
这个查询特别糟糕:
@Query(value = "{$and: [{?0 : { $exists: true }}, {'lastChanged': {$gt: ?1}}] }")
List<Event> findAllByPrefixedInvitedUserAndLastChangedLessThan(String prefixedUserID, LocalDateTime lastChanged);
其中prefixedUserID
正在查询嵌入的文档(由字符串"invitedUser.userID"
访问,顺便说一句,这是我使用标准查询语法或自定义查询无法解决的问题)< / p>
实际问题是此查询大约需要8-10秒,数据库包含4个(!!!)事件。
为了研究这种糟糕的性能,我减少了要调试的spring数据的日志级别,并获得了单个函数调用的~20.0000行的日志文件(来自类getAllEventsForUser
的{{1}}函数是在我的repo中可以找到 - &gt;。我将日志放入this gist。
正如您所见,de.steilerdev.myVerein.server.controller.user.EventController
被召唤数千次。我无法真正调试这个问题,所以我希望项目的任何开发人员都在研究这个问题。
另一种可能性是配置问题,但我在更改日志中找不到任何通知,其中说我必须在更新时更改任何特定条目。不过,您可以在我的仓库的这个文件夹中找到所有数据库和弹簧相关的配置(参见上面的链接):
MongoDbUtils [doGetDB] - Getting Mongo Database name=[myVerein]
(很遗憾,我没有足够的声誉来发布两个以上的链接)
我希望有人可以帮我解决这个问题。提前谢谢!
P.S。:/src/main/webapp/WEB-INF/configuration/
函数的重复调用发生在我的所有查询中,但不太常见(“仅”几百次)
P.P.S。:我正在运行MongoDB 3.0.1版
答案 0 :(得分:0)
我怀疑的是invitedDivision
中的Event
属性导致问题。默认情况下会急切地加载DBRef,这意味着您将看到集合中每个文档的查找。
您可能想尝试在此处设置lazy
注释的@DBRef
属性,以避免急切查找。此外,切换到引用ID并通过其存储库手动解析Divisions
也是一种选择。
您看到升级到1.7时发生的变化很可能与我们为确保与MongoDB 3.0驱动程序的兼容性所做的更改有关。我已经提交DATAMONGO-1193来解决这个问题。我还提交了DATAMONGO-1194来解决使用MongoDB 3.0驱动程序的问题,因为它也会让用户升级到新的驱动程序。也就是说,上面记录的变通方法无论如何都应该有用。