我们最近升级到 Hibernate Search 4.1,当我们基于 hibernate 对锁所做的更改运行 JUnit 测试时遇到错误。当我们使用AbstractTransactionalJUnit4SpringContextTests运行 Junit 测试时,我们经常会看到每次测试后都会留下锁。在审查(如何处理 Hibernate-Search 索引恢复)时,我们尝试了本机锁,但这并没有解决问题。
我们已经使用默认目录提供程序 (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)
或者
build 19-Apr-2012 19:31:09 ERROR 2012-04-19 19:31:09,395 153552 (LuceneBackendTaskStreamer.java:61) org.hibernate.search.backend.impl.lucene.LuceneBackendTaskStreamer - HSEARCH000072: Couldn't open the IndexWriter because of previous error: operation skipped, index ouf of sync!
其中一些消息似乎显示了从一个测试级联到另一个测试的锁定问题,因此需要重置,有些可能是有效的,因为测试正在测试“无效”行为以及我们的应用程序如何对它们做出反应,但通常是因为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 以清理锁定文件并重置索引不同步或损坏的潜在问题?在测试套件开始时,我们擦除索引目录,是否建议在每次测试后擦除它?
谢谢