我在我的应用程序中要求我们需要在用户的基础上存储索引,所以我试图在运行时更改位置,但索引不会存储在新位置,如果我在配置文件中给出相同的位置然后它正在存储
我使用以下代码更改位置
LocalSessionFactoryBean localSessionFactoryBean
localSessionFactoryBean.getConfiguration() .setProperty("hibernate.search.default.indexBase", "New_loc")
localSessionFactoryBean.getObject().getCurrentSession() //on this session object i am doing DAO opertation .
我在配置文件中给出的休息配置。我投入了3天的时间来找到解决方案,但没有成功。任何帮助将非常感激。 我的会话代码如下:
protected Session getSession() {
Configuration conf=sessionFactory.getConfiguration();
conf.setProperty("hibernate.search.default.indexBase","c:\\testdata" /*CustomerContextHolder.getFile()!=null?CustomerContextHolder.getFile():defaultFileLocation*/);
ContextHolder.getOrBuildSearchFactory(conf);
return sessionFactory.getObject().getCurrentSession();
// sessionFactory.getObject().openSession();
}
和Bean正在关注
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!-- Options are [validate, create, update, create-drop] -->
<!-- <prop key="hibernate.current_session_context_class">thread</prop> -->
<!-- Connection pool size -->
<prop key="hibernate.connection.pool_size">${hibernate.connection.pool_size}</prop>
issue -->
<prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.impl.FSDirectoryProvider</prop>
<prop key="hibernate.search.default.locking_strategy">single</prop>
<prop key="hibernate.search.default.indexBase">c:\abc</prop>
<prop key="hibernate.search.lucene_version">LUCENE_35</prop>
</props>
</property>
更新代码:
Session getSession() {
Configuration conf=sessionFactory.getConfiguration();
conf.setProperty("hibernate.search.default.indexBase","c:\\testdata");
//conf.configure(); Need to commented otherwise shwoing duplicate Property
ServiceRegistry serviceRegistry= new ServiceRegistryBuilder().applySettings(
conf.getProperties()).buildServiceRegistry();
return (Session) conf.buildSessionFactory(serviceRegistry).openSession();
}
答案 0 :(得分:2)
尝试这样做:(对于Hibernate 4.x)
Configuration cfg = localSessionFactoryBean.getConfiguration();
cfg .setProperty("hibernate.search.default.indexBase", "New_loc");
cfg.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(
cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
答案 1 :(得分:1)
我不确定这种动态变化的索引库是否有效。重建工厂似乎也很狡猾。您是否看过索引分片 - http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#advanced-features-dynamic-sharding。这应该允许您根据让我们说的用户ID分割数据。
如果分片无法解决您的问题,您可以优化实际的用例。也许有另一种解决方案。
答案 2 :(得分:0)
经过多次努力之后我终于找到了原因。如果我在每次数据库写入后关闭sesson,那么只有索引文件会存储在新的位置。但这不是有效的方法,但这是它是如何工作的