Db4o系列之十二:查询模式

Db4o里面的查询模式:

在Db4o里面有三种查询模式:立即模式、懒惰模式和快照模式

1. 立即模式:默认采用的是这种模式,一次查询时把所查到的对象的ID放到结果集合里面,等所有ID都得到后再返回整个集合,如果要手动设置立即模式的话,可以通过如下代码设置:

configuration.queries().evaluationMode(QueryEvaluationMode.IMMEDIATE);

用这种查询模式会花费一定的时间(第一个结果要等到所有查询结果出来才可以返回),并且要花费一定的空间,如果你的查询结果数量巨大的话,特别是在C/S模式下,这样的时间会让用户失去等待的信心和增加服务器的负担。这种查询模式查询的结果是所有已经commit了的对象的引用,查询结束后如果还有新的事务提交了或者当前事务对结果集进行了修改,它并不会影响到已经查询到了的结果,所以有可能你查询结束后在查看你的查询结果会发现有的结果并不满足你的查询条件!这是因为有其他事务修改了部分被你引用的对象,并且提交了事务。但如果你要遍历所有查询对象的时候,这种方式是速度最快的

2. 懒惰模式:在这种模式下,查询的时候根本不会去评估对象,取而代之的根据找到的最好索引建立一个迭代子,后续的查询操作是等到程序遍历查询结果的时候才进行,因而用户基本上可以立即得到第一个查询结果。懒惰模式的设置方式如下:
configuration.queries().evaluationMode(QueryEvaluationMode.LAZY);

在懒惰模式下,不仅第一个查询结果可以立即得到,而且它需要的空间非常小,因为它不需要存储查询结果的ID集合,而且不用结存单个查询结果,因而它基本上不需要什么空间,而不管你的查询结果有多大。和立即模式不同的是,这种查询模式每次都会重新计算查询,所以会把其他事务已经提交的或者当前事务修改尚未提交的也给列进查询的范围,这有可能引发一种可怕的死循环:当前事务对查询结果进行修改使得修改后的结果又符合查询条件,并且是在查询条件的最后!这样子将会是无限的死循环了L 当然,有一种避免方案就是每次修改后把中间结果写到一个临时的队列里面,等所有结果完了再保存。对这种查询结果的操作有时也会让它变为快照方式或者立即模式,如调用result.size()

3. 快照模式:快照模式既有懒惰模式的所有优点,又克服了它的所有缺点!当查询发起的时候,查询处理器选择最好的索引,并且建立一份当前索引的快照,因而它不会出现遍历查询结果的时候发现有不符合查询条件的结果,但可能出现你遍历结果的时候发现比你一得到结果就调用result.size()所得到的数量少。设置快照模式如下:
configuration.queries().evaluationMode(QueryEvaluationMode.SNAPSHOT);
但有点小遗憾的是要保存索引的快照

你可能感兴趣的:(服务器,存储)