【问题标题】:SpringData MongoDB performance bug/issue after update更新后的 SpringData MongoDB 性能错误/问题
【发布时间】:2015-03-31 14:54:51
【问题描述】:

将 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 数据的日志级别以进行调试,并为单个函数调用获得了约 20.0000 行的日志文件(调用了 de.steilerdev.myVerein.server.controller.user.EventController 类中的 getAllEventsForUser 函数 -> 可以可以在我的repo 中找到。我把日志放到this gist

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

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

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

(不幸的是,我没有足够的声誉来发布两个以上的链接)

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

P.S.:doGetDB 函数的重复调用发生在我的所有查询中,但频率较低(“仅”几百次)

P.P.S.:我正在运行 MongoDB 3.0.1 版

【问题讨论】:

  • 您是否有机会添加一个重现日志输出的测试用例?调用存储库方法等?
  • 我不确定您在寻找什么,但是调用此存储库函数会导致大部分输出。完整的日志是由我上面提到的函数生成的,可以在链接的 github repo 中找到。它是类 [de.steilerdev.myVerein.server.controller.user.EventController][1] 中的 getAllEventsForUser 函数。我希望这就是你要找的。 [1]:github.com/steilerDev/myVerein/blob/master/Code/Server/src/main/…
  • 我正在寻找一些我可以执行的代码来重现您看到的日志输出。这通常是一个测试用例。
  • 我明白了。不幸的是,我还没有任何单元测试。但是您可以执行以下操作:1) 使用 Tomcat 8 和本地 Mongo 克隆 repo 并运行 java 服务器(位于 /Code/Server/) 2) 在浏览器中打开索引页面(这会在“myVerein”数据库)3)使用 curl 或类似方法登录 REST-API,将 username=frank@steiler.eu 和 password=asdf 发布到 /api/login(应该以 200 OK 响应) 4)获取资源 /api /user/event 带有参数 lastChanged=2015-03-28T01:00:00 这可能需要一段时间并产生问题
  • 好吧,请注意,如果您不能提供最小的重现测试用例,您就不太可能获得帮助。没有人会涉足过多的代码,运行应用程序,与之交互。如果我无法通过 mvn clean 测试重现问题,那么很遗憾,我不能花任何时间。

标签: mongodb spring-data spring-data-mongodb spring-4


【解决方案1】:

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

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

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

【讨论】:

  • 哇,它做到了!只是一个后续问题:为什么默认情况下不启用惰性?到处使用lazy时是否存在重大性能问题,或者这样做时是否存在问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多