Как я могу настроить индексы для использования db4o с Spring? - PullRequest
1 голос
/ 16 декабря 2010

Я сейчас оцениваю интеграцию 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 Ответ

1 голос
/ 17 декабря 2010

К сожалению, я не очень хорошо знаю расширение пружины для db4o.

Однако функция Db4o.configure () устарела и работает иначе, чем в более ранних версиях. В более ранних версиях была глобальная конфигурация db4o. Не эта конфигурация больше не существует. Вызов Db4o.configure () не меняет конфигурацию для запуска контейнеров объектов.

Теперь вы можете попробовать выполнить эту работу и запустить работающий контейнер:

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

Таким образом вы изменяете конфигурацию контейнера запущенных объектов. Обратите внимание, что изменение конфигурации контейнера работающего объекта может привести к опасному побочному эффекту и должно использоваться только в качестве крайней меры.

...