【发布时间】: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