更新后 Spring Data MongoDB 性能 bug/issue

SpringData MongoDB performance bug/issue after update

将 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" 访问,顺便说一下,这是我无法使用标准查询语法或自定义查询解决的问题)

实际问题是这个查询大约需要 8-10 秒,数据库包含 4 个 (!!!) 事件。

为了调查这种糟糕的性能,我降低了 spring 数据的日志级别以进行调试,并为单个函数调用(getAllEventsForUser 函数从 class de.steilerdev.myVerein.server.controller.user.EventController 被称为 -> 可以在我的 repo). I put the log into this gist.

中找到

如您所见,MongoDbUtils [doGetDB] - Getting Mongo Database name=[myVerein] 被调用了数千次。我无法真正调试这个问题,所以我希望该项目的任何开发人员都在调查这个问题。

另一种可能是配置问题,但我在更新日志中找不到任何通知,其中说我必须在更新时更改任何特定条目。不过,您可以在我的存储库的这个文件夹中找到所有数据库和 spring 相关配置(参见上面的 link):

/src/main/webapp/WEB-INF/configuration/

(不幸的是我没有足够的声望 post 超过两个 link)

希望有人能帮我解决这个问题。提前致谢!

P.S.: doGetDB 函数的重复调用出现在我的所有查询中,但频率较低("only" 几百次)

P.P.S.: 我是运行MongoDB版本3.0.1

我在这里怀疑 Event 中的 invitedDivision 属性 是导致问题的原因。默认情况下会急切加载 DBRef,这意味着您将看到对集合中每个文档的查找。

您可能想尝试在此处设置 @DBRef 注释的 lazy 属性以避免急切查找。此外,切换到引用 ID 并通过其存储库手动解析 Divisions 也是一种选择。

您看到升级到 1.7 时发生的变化很可能与我们为确保与 MongoDB 3.0 驱动程序的兼容性所做的更改有关。我已经提交 DATAMONGO-1193 to fix that. I also file DATAMONGO-1194 来修复 MongoDB 3.0 驱动程序的使用问题,因为它也会影响升级到新驱动程序的用户。也就是说,上面记录的解决方法在任何情况下都应该有效。