Hibernate Search& Lucene - 设置写超时锁定

时间:2017-10-02 08:37:15

标签: lucene hibernate-search

我有一个

org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/XXXXX/User_Index/write.lock

异常,我读到写入超时锁定应该从默认的1秒增加。


有趣的是,以前我没有这个例外,但是我正在完成一项在项目中使用Spring的任务。尝试访问索引的竞争交易数量很少......?我不认为我认为Spring事务配置正确:

<!-- for the @Transactional annotations -->
<tx:annotation-driven />
<context:component-scan base-package="XXX.audit, XXX.authorization, XXX.policy, XXX.printing, XXX.provisioning, XXX.service.plainspring" />
<!-- defining Transaction Manager for Spring -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="dataSource" ref="dataSource" />
    <property name="sessionFactory" ref="sessionFactory" />
</bean> 

所以我尝试配置写锁定超时,如

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" lazy-init="true">
    ...
    <property name="hibernateProperties">
        <props>
            ...
            <prop key="hibernate.search.lucene_version">LUCENE_35</prop>
            <prop key="hibernate.search.default.indexwriter.writeLockTimeout">20000</prop>
            ...
    </property>
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
</bean>

但没有成功。 Apache Lucene没有配置文件。此外,没有Lucene代码,只使用了Hibernate Search(即无法设置IndexWriter的值)

如何配置写锁定超时?

Apache Lucene 3.5 Hibernate Search 4.1.1

谢谢,

1 个答案:

答案 0 :(得分:2)

没有选项可以配置IndexWriter锁定超时,因为永远不需要这样做。

如果你发现这种超时发生,通常是因为:

  • 索引目录中有一个锁定文件,作为崩溃的JVM的遗留物
  • 配置不适合应用程序的体系结构

首先检查左侧场景:关闭应用程序并查看是否有文件名write.lock。如果应用程序没有运行,则删除此文件是安全的。

如果情况并非如此,那么您可能有两个不同的Hibernate Search实例尝试使用相同的索引目录,并且都试图写入它。 这不是一个有效的配置,你得到了异常,因为索引已被其他实例锁定;锁定超时增加只会让你等待很长时间 - 可能直到另一个应用程序关闭。

不要在应用程序之间共享索引;如果您确实需要这样做,请查看基于JMS的后端或其他非默认后端的手册,这些后端允许多个应用程序共享一个IndexWriter。

最后,请考虑升级。这些版本非常陈旧。