2011-09-23 111 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替換所有這些罐子。

相關問題