2010-12-15 6 views
1

Ich werte gerade die Spring-db4o Integration aus. Ich war beeindruckt von der deklarativen Transaktionsunterstützung und der einfachen Möglichkeit, eine deklarative Konfiguration bereitzustellen.Wie kann ich die Indizes für die Verwendung von db4o mit Spring konfigurieren?

Leider habe ich Probleme, einen Index für bestimmte Felder zu erstellen. Spring bereitet die Datenbank beim Start des Tomcat-Servers vor. Hier ist meine Feder Eintrag:

<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 bietet keine Mittel, den Index zu bestimmen. Ich habe einen einfachen ServiceServletListener geschrieben, um den Index zu setzen. Hier ist der relevante Code:

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

ich rund 6000 Zeilen in dieser Tabelle eingefügt und verwendet dann eine SODA-Abfrage eine Zeile abzurufen auf dem Schlüssel basiert. Aber die Leistung war ziemlich schlecht. Um sicherzustellen, dass Indizes ordnungsgemäß angewendet wurde, lief ich das folgende Programm:

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! "); 
      } 
     } 
    } 
} 

Leider sind die Ergebnisse zeigen, dass kein Feld indiziert ist.

In einem ähnlichen Kontext sah ich im OME-Browser, dass es eine Option gibt, Index für Felder jeder Klasse zu erstellen. Wenn ich den Index auf "true" und "save" setze, scheint die Änderung auf db4o anzuwenden. Wenn Sie diesen Beispieltest für die Datei db4o ausführen, wird jedoch kein Index angezeigt.

Alle Hinweise dazu werden sehr geschätzt.

Antwort

1

Leider kenne ich die Federverlängerung für db4o nicht gut.

Allerdings ist das Db4o.configure() Zeug veraltet und funktioniert anders als in früheren Versionen. In früheren Versionen gab es eine globale db4o-Konfiguration. Diese Konfiguration existiert nicht mehr. Der Db4o.configure() - Aufruf ändert die Konfiguration für das Ausführen von Objektcontainern nicht.

Nun könnte man versuchen, diese Arbeit um zu tun und einen laufenden Behälter:

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

diese Weise können Sie die Konfiguration des laufenden Objektcontainer ändern. Beachten Sie, dass das Ändern der Konfiguration eines aktiven Objektcontainers zu gefährlichen Nebeneffekten führen kann und nur als letztes Mittel verwendet werden sollte.

Verwandte Themen