更新后的SpringData MongoDB性能错误/问题



在将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驱动程序一起使用,因为它也会影响升级到新驱动程序的用户。也就是说,上面记录的解决方法在任何情况下都应该有效。

最新更新