2

我们正在使用 morphia 0.99 和 java driver 2.7.3 我想了解使用 asList 获取记录fetch和检索结果之间有什么区别(假设有足够的内存来检索记录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 实现它们之间没有任何区别?

感谢您的回答

4

3 回答 3

3

据我了解实现,fetch()来自数据库的流结果同时asList()会将所有查询结果加载到内存中。因此,它们都将获取与查询匹配的每个对象,但asList()会将它们全部加载到内存中,而fetch()由您决定。

对于您的用例,它在 CPU 方面都不会更快,但fetch()应该使用更少的内存并且不会在您有很多数据库记录的情况下爆炸。

于 2014-08-08T10:13:58.503 回答
2

从源代码来看,为您asList()使用fetch()和汇总结果,因此我看不出两者之间有太大区别。

于 2012-12-28T01:47:00.050 回答
1

一个非常有用的区别是,如果以下两个条件适用于您的场景:

  1. 您在查询中使用offsetand limit
  2. 您正在更改对象上的值,以使其不再在查询中返回。

假设您正在对 进行查询awesome=true,并且您正在使用offsetandlimit进行多个查询,一次返回 100 条记录,以确保您没有使用太多内存。如果在迭代循环中设置awesome=false对象并保存它,则会导致您错过更新某些记录。

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

于 2014-09-14T02:44:48.740 回答