休眠搜索&;Lucene-设置写入超时锁

休眠搜索&;Lucene-设置写入超时锁,lucene,hibernate-search,Lucene,Hibernate Search,我有一个 org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/XXXXX/User_Index/write.lock 异常,我读到写超时锁应该从默认的1秒增加 ( 有趣的是,之前我没有出现这种异常,但我正在处理一项任务,以便在项目中使用Spring。有一个很小的机会,有更多的竞争事务试图访问索引…?我认为Spring事务配置不正确: <!-- for the @Tr

我有一个

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>

...
...
卢塞诺35
20000
...
但是没有成功。Apache Lucene没有配置文件。此外,没有Lucene代码,只使用Hibernate搜索(即无法设置IndexWriter的值)

如何配置写入锁定超时

ApacheLucene 3.5 Hibernate搜索4.1.1

谢谢,

V.

没有配置IndexWriter锁定超时的选项,因为这应该永远不需要

如果您看到发生这种超时,通常是因为以下任一原因:

  • 索引目录中有一个锁文件,是崩溃的JVM留下的
  • 该配置不适合应用程序的体系结构
首先检查剩下的场景:关闭应用程序,查看是否有文件名
write.lock
。如果应用程序未运行,则可以安全地删除此文件

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

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


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

没有配置IndexWriter锁定超时的选项,因为这应该永远不需要

如果您看到发生这种超时,通常是因为以下任一原因:

  • 索引目录中有一个锁文件,是崩溃的JVM留下的
  • 该配置不适合应用程序的体系结构
首先检查剩下的场景:关闭应用程序,查看是否有文件名
write.lock
。如果应用程序未运行,则可以安全地删除此文件

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

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


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

您好,Sanne,很抱歉没有早点回来,谢谢您的回复。我们引入了ContextLoaderListener和其他标准的Spring内容,现在出现了这个错误。以前我们有相同的架构(带有Hibernate搜索和批处理作业的web应用程序,用于刷新索引),但没有得到错误。顺便说一句,只有在群集环境中运行更多web应用程序实例并使每台计算机上的索引保持最新时,才需要批处理作业。有更好的方法吗?谢谢对不起,我不知道“其他标准Spring东西”是如何工作的。我建议您验证是否所有这些应用现在都试图在同一个索引上写入;也许这改变了?即使在旧版本上,您也肯定会遇到同样的问题,因为这是此类索引的一个基本限制。您正在使用Infinispan目录集成吗?在集群环境中,跨多个服务器复制索引是很流行的做法,但要确保只有一个节点在写入索引,仍取决于您的代码。另见我已经找到的页面,这能工作吗?谢谢嗨,桑娜,很抱歉没有早点回来,谢谢你的回复。我们引入了ContextLoaderListener和其他标准的Spring内容,现在出现了这个错误。以前我们有相同的架构(带有Hibernate搜索和批处理作业的web应用程序,用于刷新索引),但没有得到错误。顺便说一句,只有在群集环境中运行更多web应用程序实例并使每台计算机上的索引保持最新时,才需要批处理作业。有更好的方法吗?谢谢对不起,我不知道“其他标准Spring东西”是如何工作的。我建议您验证是否所有这些应用现在都试图在同一个索引上写入;也许这改变了?即使在旧版本上,您也肯定会遇到同样的问题,因为这是此类索引的一个基本限制。您正在使用Infinispan目录集成吗?在集群环境中,跨多个服务器复制索引是很流行的做法,但要确保只有一个节点在写入索引,仍取决于您的代码。另见我已经找到的页面,这能工作吗?谢谢