我目前正在评估Spring-db4o集成。声明式事务支持以及提供声明性配置的简易性给我留下了深刻的印象。
不幸的是,我正在努力想出如何在特定领域创建索引。 Spring在tomcat服务器启动期间准备db。这是我的春季参赛作品:
<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文件上运行此样本测试,则不会显示任何索引。
对此的任何指示都将受到高度赞赏。
答案 0 :(得分:1)
不幸的是,我不熟悉db4o的spring扩展。
然而,Db4o.configure()的内容已弃用,其工作方式与早期版本不同。在早期版本中,存在全局db4o配置。不再存在此配置。 Db4o.configure()调用不会更改运行对象容器的配置。
现在你可以尝试做这个工作并运行一个容器:
container.ext().configure().objectClass(com.test.Metadata.class).objectField("id").indexed(true);
这样就可以更改正在运行的对象容器的配置。请注意,更改正在运行的对象容器的配置可能会导致危险的副作用,并且应仅用作最后的手段。