【问题标题】:Hibernate Search & Lucene - set write timeout lockHibernate Search & Lucene - 设置写超时锁
【发布时间】:2017-10-02 08:37:15
【问题描述】:

我有一个

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 休眠搜索 4.1.1

谢谢,
五、

【问题讨论】:

    标签: lucene hibernate-search


    【解决方案1】:

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

    如果您看到发生这样的超时,通常是由于以下任一原因:

    • 索引目录中有一个锁定文件,是崩溃的 JVM 遗留下来的
    • 配置不适合应用的架构

    首先检查剩下的场景:关闭你的应用程序,看看是否有文件名write.lock。如果应用程序没有运行,删除这个文件是安全的。

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

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

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

    【讨论】:

    • 嗨,Sanne,很抱歉没有早点回来,感谢您的回复。我们引入了 ContextLoaderListener 和其他标准的 Spring 东西,现在我们遇到了这个错误。以前我们有相同的架构(带有 Hibernate Search 的 Web 应用程序和刷新索引的批处理作业)但没有收到错误。顺便说一句,只有在运行更多 Web 应用程序实例并使每台机器上的索引保持最新时,集群环境才需要批处理作业。有没有更好的方法来做到这一点?谢谢!
    • 对不起,我不知道“其他标准的 Spring 东西”是如何工作的。我建议您验证所有这些应用程序现在是否都在尝试在同一个索引上写入;也许这改变了?即使在旧版本上,您肯定也会遇到同样的问题,因为这是此类索引的基本限制。您是否使用 Infinispan 目录集成?这在集群环境中很流行,可以在多台服务器之间复制索引,但仍然需要您的代码来确保只有一个节点在写入。另见docs.jboss.org/hibernate/stable/search/reference/en-US/…
    • 我找到了linhtech.wordpress.com/2010/10/06/… 页面,可以吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多