2010-12-15 190 views
1

J'évalue actuellement l'intégration de Spring-db4o. J'ai été impressionné par le support des transactions déclaratives ainsi que la facilité de fournir une configuration déclarative.Comment puis-je configurer les index pour utiliser db4o avec Spring?

Malheureusement, j'ai du mal à comprendre comment créer un index sur des champs spécifiques. Spring prépare la base de données pendant le démarrage du serveur Tomcat. Voici mon entrée de printemps:

<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 ne fournit aucun moyen pour spécifier l'index. J'ai écrit un simple ServiceServletListener pour définir l'index. Voici le code correspondant:

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

I inséré autour de 6000 lignes dans ce tableau, puis utilisé une requête SODA pour récupérer une ligne basée sur la clé. Mais la performance était plutôt mauvaise. Pour vérifier que les indices ont été appliqués correctement, je courais le programme suivant:

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

Malheureusement, les résultats montrent que aucun champ est indexé. Dans un contexte similaire, dans le navigateur OME, j'ai vu qu'il y avait une option pour créer un index sur les champs de chaque classe. Si je mets l'index à true et enregistre, il semble appliquer le changement à db4o. Mais encore une fois, si vous exécutez cet exemple de test sur le fichier db4o, il ne révèle aucun index.

Tout pointeur sera très apprécié.

Répondre

1

Malheureusement, je ne connais pas très bien l'extension du ressort pour db4o.

Toutefois, le contenu de Db4o.configure() est obsolète et fonctionne différemment que dans les versions antérieures. Dans les versions antérieures, il existait une configuration db4o globale. Non cette configuration n'existe plus. L'appel Db4o.configure() ne modifie pas la configuration pour l'exécution des conteneurs d'objets.

Maintenant, vous pouvez essayer de faire ce travail autour et un conteneur en cours d'exécution:

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

De cette façon, vous modifiez la configuration du conteneur d'objets en cours d'exécution. Notez que la modification de la configuration d'un conteneur d'objets en cours d'exécution peut entraîner des effets secondaires dangereux et ne doit être utilisée qu'en dernier recours.