我们正在使用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实现它们之间没有任何区别?
感谢您的回答
答案 0 :(得分:3)
据我了解实现,fetch()
流来自数据库的结果,而asList()
将所有查询结果加载到内存中。因此,他们将获得与查询匹配的每个对象,但asList()
会将所有对象全部加载到内存中,而fetch()
会将其留给您。
对于你的用例,它在CPU方面都不会更快,但是fetch()
应该使用更少的内存,并且在你有大量数据库记录时不会爆炸。
答案 1 :(得分:2)
答案 2 :(得分:1)
如果以下两个条件适用于您的方案,那么一个非常有用的区别是:
offset
和limit
。所以说你正在对awesome=true
进行查询,而你使用offset
和limit
进行多次查询,一次返回100条记录,以确保你没有#39} ; t耗尽太多记忆。如果在迭代循环中,在对象上设置awesome=false
并保存它,则会导致您错过更新某些记录。
在这种情况下,fetch()
将是更好的方法。