2017-04-05 141 views
0

我有一个WebAppilcation runnig与JPA(Hibernate 5.0.11.Final)和Hibernate搜索(5.5.5.Final),其中用户试图保存一个新的实体。因此,将会有如下几个呼叫:Hibernate搜索:持久原因有时OverlappingFileLockException

protected Object saveNewEntity(Object toSave) { 
    if (factory == null) { 
     factory = Persistence 
      .createEntityManagerFactory(DBBase.PERSISTENCE_UNIT); 
    } 
    EntityManager em = initEntityManager(); 
    try { 
     em.setFlushMode(FlushModeType.COMMIT); 
     EntityTransaction transaction = em.getTransaction(); 
     transaction.begin(); 
     em.persist(toSave); 
     transaction.commit(); 
    } catch (Exception e) { 
     throw e; 
    } finally { 
     finalizeEntityManager(em); 
    } 
    return toSave; 
} 

protected void finalizeEntityManager(EntityManager em) { 
    if (em != null && em.isOpen()) { 
     em.close(); 
    } 
} 

索引的实体也以这种方式保存。它没有Cascading并且完全平坦(没有涉及其他表格)。

大多数情况下,这将运行良好,索引将更新。

但有时候,我不知道为什么,在follwing异常会发生,为此该索引将不会被更新:

2017-04-04 10:30:48,552 ERROR [LuceneBackendQueueTask:run:54] HSEARCH000073: Error in backend 
java.nio.channels.OverlappingFileLockException 
    at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) ~[?:1.8.0_121] 
    at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152) ~[?:1.8.0_121] 
    at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1108) ~[?:1.8.0_121] 
    at java.nio.channels.FileChannel.tryLock(FileChannel.java:1155) ~[?:1.8.0_121] 
    at org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:114) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:775) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:123) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:89) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:112) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriterDelegate(AbstractWorkspaceImpl.java:198) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:80) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:46) [hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.applyChangesets(SyncWorkProcessor.java:162) [hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.run(SyncWorkProcessor.java:148) [hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121] 
2017-04-04 10:30:48,555 ERROR [LogErrorHandler:handleException:67] HSEARCH000058: Exception occurred java.nio.channels.OverlappingFileLockException 
Primary Failure: 
    Entity com.rhenus.de.cm.essentials.entities.ContractSearchEntity Id 96926 Work Type org.hibernate.search.backend.AddLuceneWork 

java.nio.channels.OverlappingFileLockException 
    at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) ~[?:1.8.0_121] 
    at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152) ~[?:1.8.0_121] 
    at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1108) ~[?:1.8.0_121] 
    at java.nio.channels.FileChannel.tryLock(FileChannel.java:1155) ~[?:1.8.0_121] 
    at org.apache.lucene.store.NativeFSLockFactory.obtainFSLock(NativeFSLockFactory.java:114) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.apache.lucene.store.FSLockFactory.obtainLock(FSLockFactory.java:41) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.apache.lucene.store.BaseDirectory.obtainLock(BaseDirectory.java:45) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:775) ~[lucene-core-5.3.1.jar:5.3.1 1703449 - noble - 2015-09-17 01:38:09] 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:123) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:89) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:112) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriterDelegate(AbstractWorkspaceImpl.java:198) ~[hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:80) [hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:46) [hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.applyChangesets(SyncWorkProcessor.java:162) [hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.run(SyncWorkProcessor.java:148) [hibernate-search-engine-5.5.5.Final.jar:5.5.5.Final] 
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121] 

我不手动锁定或更新指标,也不是使用的索引由不同的线程,应用程序或其他。 我读过,这可能发生,如果该实体已经有一个id,并在堆栈跟踪id说。但我确定不要坚持带有ID的实体。所以也许有一个并发效应?

任何提示和帮助表示赞赏。如果您需要更多信息,只需询问并提供即可。谢谢。

+0

我不得不在persistence.xml任何进一步的配置,所以collegue告诉我,我可以尝试: '<属性名=“hibernate.search.default.locking_strategy”价值=“无​​” /> \t <财产name =“org.hibernate.search.store.LockFactoryProvider”value =“org.apache.lucene.store。NoLockFactory”/> 我会回来报告,如果这有帮助。由于错误不可挑衅,这可能需要一段时间。 – dredg189

回答

3

问题其实不在Hibernate Search中,而是在前三行代码中。

您声明“不是由不同线程,应用程序或任何其他应用程序使用的索引”,但您也建议这是一个Web应用程序,因此它很可能需要对不受控制的事件作出反应,可能会同时发生,即使您没想到。

什么是保证这些初始代码行不被同时调用? EntityManagerFactory的初始化可能会被触发多次,但没有代码会关闭已经启动的副本。

在实践中,您正在运行Hibernate Search的多个副本,并争取获得独占索引锁定。

让我建议永不禁用锁定机制:它旨在保护您免受类似的错误。由于很好的原因,默认启用。我也建议使用一些标准的方法来初始化Hibernate和/或JPA,任何流行的JavaEE容器(如WildFly)或框架都可能“做得对”,并且一些最高级的容器可以自动启用一些疯狂的优化。