2010-12-15 78 views
1

我目前正在評估Spring-db4o集成。聲明式事務支持以及輕鬆提供聲明式配置給我留下了深刻的印象。如何配置與Spring一起使用db4o的索引?

不幸的是,我很難想出如何在特定字段上創建索引。 Spring正在準備tomcat服務器啓動期間的數據庫。這裏是我的彈簧條目:

<bean id="objectContainer" class="org.springmodules.db4o.ObjectContainerFactoryBean"> 
    <property name="configuration" ref="db4oConfiguration" /> 
    <property name="databaseFile" value="/WEB-INF/repo/taxonomy.db4o" /> 
</bean> 
<bean id="db4oConfiguration" class="org.springmodules.db4o.ConfigurationFactoryBean"> 
    <property name="updateDepth" value="5" /> 
    <property name="configurationCreationMode" value="NEW" /> 
</bean> 
<bean id="db4otemplate" class="org.springmodules.db4o.Db4oTemplate"> 
    <constructor-arg ref="objectContainer" /> 
</bean> 

db4oConfiguration不提供任何方法來指定索引。我編寫了一個簡單的ServiceServletListener來設置索引。下面是相關代碼:

Db4o.configure().objectClass(com.test.Metadata.class).objectField("id").indexed(true); 
Db4o.configure().objectClass(com.test.Metadata.class).objectField("value").indexed(true); 

我在此表中插入了大約6000行,然後使用SODA查詢根據密鑰檢索行。但表現相當糟糕。要驗證索引是否已正確應用,我運行了以下程序:

private static void indexTest(ObjectContainer db){ 
    for (StoredClass storedClass : db.ext().storedClasses()) { 
     for (StoredField field : storedClass.getStoredFields()) { 
      if(field.hasIndex()){ 
       System.out.println("Field "+field.getName()+" is indexed! "); 
      }else{ 
       System.out.println("Field "+field.getName()+" isn't indexed! "); 
      } 
     } 
    } 
} 

不幸的是,結果顯示沒有字段被索引。

在類似的上下文中,在OME瀏覽器中,我看到有一個選項可以在每個類的字段上創建索引。如果我將索引變爲true並保存,它似乎是將更改應用於db4o。但是,如果在db4o文件上運行此示例測試,它不會顯示任何索引。

對此的任何指針將不勝感激。

回答

1

不幸的是,我不知道db4o的彈簧擴展。

但是,Db4o.configure()的東西已被棄用,並且與早期版本不同。在早期版本中,有一個全局的db4o配置。不是這個配置不再存在。 Db4o.configure()調用不會更改運行對象容器的配置。

現在,你可以嘗試做這項工作圍繞和運行的容器:

container.ext().configure().objectClass(com.test.Metadata.class).objectField("id").indexed(true); 

這樣你改變正在運行的對象容器的配置。請注意,更改正在運行的對象容器的配置可能會導致危險的副作用,應僅作爲最後手段使用。

相關問題