2011-09-23 2 views
1

누군가가 내게 설명해 주실 수 있습니까? 활성화 깊이가 아래의 코드 샘플에서 의 효과가없는 것 같습니다.db4o : ActivationDepth가 효과가없는 것 같습니다. (?)

이 샘플은 모두 에 숫자와 하위 블록이있는 '블록'개체를 만듭니다. ActivationDepth 이후

, 나는 단지 01 블록과 02는 데이터베이스에서 검색 될 수 을 기대하는 '2'로 설정되어 있지만, 아이 블록 (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

내 가장 좋은 방법은 당신이 NQ 최적화에 필요한 클래스를 포함 db4o는-XXX-nqopt.jar 누락 점이다

여기에 전체 코드 샘플입니다.

NQ 쿼리가 실패해도 최적화 된 db4o를 실행하는 기준은 여전히 ​​쿼리를 실행하지만 이번에는 모든 후보를 활성화해야하는 평가로 나타납니다.

Test02 $ (1) 235dd910 @ :: 기본 쿼리 술어 최적화를 실행 할 수 없습니다

는 이러한 경우에 DiagnoticToConsole()의 출력을 따릅니다.

이 네이티브 쿼리는 후보 클래스의 모든 개체를 인스턴스화하여 실행되었습니다.

네이티브 쿼리 메서드에서 표현식을 단순화하는 것이 좋습니다. 네이티브 쿼리 프로세서가 코드를 더 잘 이해한다고 판단되면 http://developer.db4o.com/forums에서 db4o 포럼에 유추 쿼리 코드를 게시 할 수 있습니다.

이 문제를 해결하려면 적어도 db4o는-XXX-코어 java5.jar, db4o는-XXX-nqopt-java5.jar, db4o는-XXX-계측-java5.jar팽창-1.0.jar은 클래스 경로에 . 또는 이러한 모든 병을 db4o-xxx-all-java5.jar으로 바꿀 수 있습니다.

관련 문제