Morphia在性能方面有fetch和asList之间的区别

时间:2012-12-27 22:44:03

标签: mongodb morphia mongodb-query mongo-java

我们正在使用morphia 0.99和java驱动程序2.7.3我想知道使用fetch逐个获取记录和通过asList检索结果之间有什么区别(假设有足够的内存来检索记录通过asList)。

我们迭代一个大集合,同时使用fetch我在获取操作期间有时会在服务器上遇到cursor not found exception,所以我需要执行另一个命令才能继续,这可能是原因造成的?

1-)fetch the record 
2-)do some calculation on it 
3-)+save it back to database again 
4-)fetch another record and repeat the steps until there isn't any more records. 

那么哪一个会更快?逐个获取记录或使用asList检索结果批量,或者使用morphia实现它们之间没有任何区别?

感谢您的回答

3 个答案:

答案 0 :(得分:3)

据我了解实现,fetch()流来自数据库的结果,而asList()将所有查询结果加载到内存中。因此,他们将获得与查询匹配的每个对象,但asList()会将所有对象全部加载到内存中,而fetch()会将其留给您。

对于你的用例,它在CPU方面都不会更快,但是fetch()应该使用更少的内存,并且在你有大量数据库记录时不会爆炸。

答案 1 :(得分:2)

根据源代码判断,asList()使用fetch()并为您汇总结果,因此我看不出两者之间存在太大差异。

答案 2 :(得分:1)

如果以下两个条件适用于您的方案,那么一个非常有用的区别是:

  1. 您在查询中使用了offsetlimit
  2. 您正在更改对象的值,以便在查询中不再返回它。
  3. 所以说你正在对awesome=true进行查询,而你使用offsetlimit进行多次查询,一次返回100条记录,以确保你没有#39} ; t耗尽太多记忆。如果在迭代循环中,在对象上设置awesome=false并保存它,则会导致您错过更新某些记录。

    在这种情况下,fetch()将是更好的方法。