2011-09-23 103 views
1

有人请向我解释为什么设置 激活深度似乎没有影响 在下面的代码示例?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); 
    } 

} 

回答

0

我的最好的办法是,你缺少的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替换所有这些罐子。

相关问题