Lucene 在HibernateSearch4.1中清除JUnit测试之间的锁

Lucene 在HibernateSearch4.1中清除JUnit测试之间的锁,lucene,hibernate-search,Lucene,Hibernate Search,我们最近升级到了HibernateSearch4.1,当我们根据Hibernate对锁所做的更改运行JUnit测试时,出现了错误。当我们使用AbstractTransactionalJUnit4SpringContextTests运行Junit测试时,我们经常会看到每次测试后留下的锁。在review()中,我们尝试了本机锁,但这并没有解决问题 我们使用默认目录提供程序(Filestore)尝试了各种锁定机制(简单、单一和本机),并经常看到如下消息: build 20-Apr-2012 07:

我们最近升级到了HibernateSearch4.1,当我们根据Hibernate对锁所做的更改运行JUnit测试时,出现了错误。当我们使用AbstractTransactionalJUnit4SpringContextTests运行Junit测试时,我们经常会看到每次测试后留下的锁。在review()中,我们尝试了本机锁,但这并没有解决问题

我们使用默认目录提供程序(Filestore)尝试了各种锁定机制(简单、单一和本机),并经常看到如下消息:

build   20-Apr-2012 07:07:53    ERROR 2012-04-20 07:07:53,290 154053 (LogErrorHandler.java:83) org.hibernate.search.exception.impl.LogErrorHandler  - HSEARCH000058: HSEARCH000117: IOException on the IndexWriter
build   20-Apr-2012 07:07:53    org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@target/indexes/Resource/write.lock
build   20-Apr-2012 07:07:53        at org.apache.lucene.store.Lock.obtain(Lock.java:84)
build   20-Apr-2012 07:07:53        at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1108)
其中一些消息似乎显示了从一个测试到另一个测试的级联锁问题,因此需要重置,而有些消息可能是有效的,因为这些测试正在测试“无效”行为以及应用程序如何对它们作出反应,但通常是因为ID为null的情况

build   19-Apr-2012 19:31:11    Primary Failure:
build   19-Apr-2012 19:31:11        Entity org.tdar.core.bean.resource.CodingSheet  Id null  Work Type  org.hibernate.search.backend.PurgeAllLuceneWork
但是,无论如何,我们需要确保一个测试不会影响另一个测试

在阅读一些讨论()时,有人建议,基于RAM的目录提供程序可能是一个更好的选择,但我们希望尽可能使用与生产中使用的相同的提供程序

我们应该如何在测试之间重置HibernateSearch以清理锁定文件并重置索引不同步或损坏的潜在问题?在测试套件开始时,我们擦除索引目录,是否建议在每次测试后擦除它


谢谢

如果目录中有过时的锁,这意味着Hibernate搜索没有正确关闭,因为它肯定会关闭锁

如果在每个测试中启动一个新的Hibernate SessionFactory,则应确保在测试运行后也将其关闭:

org.hibernate.SessionFactory.close()
(这在许多示例中经常被忽略,因为忘记关闭Hibernate SessionFactory时没有明显的问题,但从来都不是可选的,可能会泄漏连接或线程)

您链接到的Hibernate邮件列表中的线程最终在Hibernate Search 4.1中将锁更改为使用本机句柄,以便在JVM崩溃或被杀死时自动清除锁。但是在您的情况下,我猜您并没有在测试之间杀死VM,所以您只需要通过关闭服务来确保锁被正确释放


exclusive\u index\u use=false隐藏问题,因为IndexWriter将在每个事务结束时关闭。但这会使其速度变慢,因为重用IndexWriter会显著提高效率。升级到Hibernate Search 4.1后出现此问题的原因是默认情况下此选项已更改为true。但即使这样,您仍然应该正确地关闭它。

我的理解是Spring管理SessionFactory生命周期,因此任何时候都不必调用close()

在测试运行期间加载了多个上下文时,我看到了这个锁定错误。例如,第一个上下文在索引文件上创建锁。第二个上下文尝试访问相同的索引,但由于第一个上下文中存在open SessionFactory,因此失败


我已经通过使用@DirtiesContext解决了这个问题,它在下一个被实例化之前关闭了上下文

一些问题似乎与使用独占与非独占锁定策略有关:hibernate.search.default.exclusive_index_use=false,它修复了上面列出的错误,但是仍然需要对测试的最佳实践进行澄清
org.hibernate.SessionFactory.close()