db4o:ActivationDepth似乎没有效果(?)
问题描述:
有人请向我解释为什么设置 激活深度似乎没有影响 在下面的代码示例?db4o:ActivationDepth似乎没有效果(?)
此样本创建“Block'对象,所有具有 一个数字和一个儿童块。
由于ActivationDepth被设置为“2”,我希望 ,只有块01和02将从 数据库中检索,但它可以遍历子块 了所有的方法来阻止05(? )。
我想这意味着对象 的整个图形加载而不是只有级别01和02,这就是我试图通过设置激活深度来避免的 。
下面是完整的代码示例:
import com.db4o.Db4oEmbedded;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.config.CommonConfiguration;
import com.db4o.config.EmbeddedConfiguration;
import com.db4o.query.Predicate;
public class Test02
{
private final String DATABASE_NAME = "MyDatabase";
public static void main(String[] args)
{
new Test02().test();
}
public void test()
{
storeContent();
exploreContent();
}
private void storeContent()
{
Block block01 = new Block(1);
Block block02 = new Block(2);
Block block03 = new Block(3);
Block block04 = new Block(4);
Block block05 = new Block(5);
Block block06 = new Block(6);
block01.setChild(block02);
block02.setChild(block03);
block03.setChild(block04);
block04.setChild(block05);
block05.setChild(block06);
ObjectContainer container = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), DATABASE_NAME);
try
{
container.store(block01);
container.store(block02);
container.store(block03);
container.store(block04);
container.store(block05);
container.store(block06);
}
finally
{
container.close();
}
}
private void exploreContent()
{
EmbeddedConfiguration configEmbedded = Db4oEmbedded.newConfiguration();
CommonConfiguration configCommon = configEmbedded.common();
configCommon.activationDepth(2); // Global activation depth.
ObjectContainer container = Db4oEmbedded.openFile(configEmbedded, DATABASE_NAME);
try
{
int targetNumber = 1;
ObjectSet blocks = getBlocksFromDatabase(container, targetNumber);
System.out.println(String.format("activationDepth : %s ", configEmbedded.common().activationDepth()));
System.out.println(String.format("Blocks found : %s ", blocks.size()));
Block block = blocks.get(0);
System.out.println(block); // Block 01
System.out.println(block.child); // Block 02
System.out.println(block.child.child); // Block 03 // Why are these
System.out.println(block.child.child.child); // Block 04 // blocks available
System.out.println(block.child.child.child.child); // Block 05 // as well ??
// System.out.println(block.child.child.child.child.child); // Block 06
}
finally
{
container.close();
}
}
private ObjectSet getBlocksFromDatabase(ObjectContainer db, final int number)
{
ObjectSet results = db.query
(
new Predicate()
{
@Override
public boolean match(Block block)
{
return block.number == number;
}
}
);
return results;
}
}
class Block
{
public Block child;
public int number;
public Block(int i)
{
number = i;
}
public void setChild(Block ch)
{
child = ch;
}
@Override
public String toString()
{
return String.format("Block number %s/child = %s ", number, child.number);
}
}
答
我的最好的办法是,你缺少的db4o-XXX-nqopt.jar其中包含NQ优化所需的类。
当NQ查询失败的标准运行优化的db4o仍然运行您的查询,但这次作为评价从那里需要激活所有候选人。
跟随DiagnoticToConsole()对此类案件的输出:
Test02 $ -1 @ 235dd910 ::本地查询谓词无法运行优化。
这种原生查询被实例化候选类的所有对象运行。
考虑简化的原生查询方法的表达。如果您觉得本机查询处理器应该理解你的代码更好,你被邀请在http://developer.db4o.com/forums发布YOUT查询代码到db4o论坛
为了解决这个问题,确保至少的db4o-XXX-核心java5.jar,的db4o-XXX-nqopt-java5.jar, 的db4o-XXX-仪表-java5.jar和膨胀-1.0.jar在你的classpath 。或者,您可以用db4o-xxx-all-java5.jar替换所有这些罐子。