在将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"
访问,顺便说一句,这是我无法使用标准查询语法或自定义查询解决的问题)
实际问题是,对于包含4(!!)个事件的数据库,此查询大约需要8-10秒。
为了研究这种糟糕的性能,我降低了要调试的spring数据的日志级别,并为单个函数调用获得了约20000行的日志文件(在我的repo中可以找到de.steilerdev.myVerein.server.controller.user.EventController
类中被调用->的getAllEventsForUser
函数)。我把日志写进了这个要点。
正如您所看到的,MongoDbUtils [doGetDB] - Getting Mongo Database name=[myVerein]
被调用了数千次。我无法真正调试这个问题,所以我希望该项目的任何开发人员都在研究这个问题。
另一种可能是配置问题,但我在更改日志中找不到任何通知,其中说我必须在更新时更改任何特定条目。尽管如此,你可以在我的repo的这个文件夹中找到所有与数据库和spring相关的配置(见上面的链接):
/src/main/webapp/WEB-INF/configuration/
(不幸的是,我没有足够的声誉发布两个以上的链接)
我希望有人能在这个问题上帮助我。提前感谢!
附言:doGetDB
函数的重复调用在我的所有查询中都会发生,但不太频繁("只有"几百次)
p.p.S.:我正在运行MongoDB 3.0.1版本
我在这里怀疑的是Event
中的invitedDivision
属性导致了问题。默认情况下,DBRef被急切地加载,这意味着您将看到集合中每个文档的查找。
您可能想尝试在此处设置@DBRef
注释的lazy
属性,以避免急于查找。此外,切换到引用ID并通过其存储库手动解析Divisions
也是一种选择。
您看到升级到1.7时发生的变化很可能与我们为确保与MongoDB 3.0驱动程序的兼容性所做的更改有关。我已经提交了DATAMONGO-1193来解决这个问题。我还提交了DATAMONGO-1194来修复这个问题,以便与MongoDB 3.0驱动程序一起使用,因为它也会影响升级到新驱动程序的用户。也就是说,上面记录的解决方法在任何情况下都应该有效。