我有一个
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
谢谢,
诉
答案 0 :(得分:2)
没有选项可以配置IndexWriter锁定超时,因为永远不需要这样做。
如果你发现这种超时发生,通常是因为:
首先检查左侧场景:关闭应用程序并查看是否有文件名write.lock
。如果应用程序没有运行,则删除此文件是安全的。
如果情况并非如此,那么您可能有两个不同的Hibernate Search实例尝试使用相同的索引目录,并且都试图写入它。 这不是一个有效的配置,你得到了异常,因为索引已被其他实例锁定;锁定超时增加只会让你等待很长时间 - 可能直到另一个应用程序关闭。
不要在应用程序之间共享索引;如果您确实需要这样做,请查看基于JMS的后端或其他非默认后端的手册,这些后端允许多个应用程序共享一个IndexWriter。
最后,请考虑升级。这些版本非常陈旧。