【问题标题】:Hibernate search: persist causes sometimes OverlappingFileLockExceptionHibernate 搜索:persist 有时会导致 OverlappingFileLockException
【发布时间】:2017-04-05 10:31:07
【问题描述】:

我有一个使用 JPA (Hibernate 5.0.11.Final) 和 Hibernate Search (5.5.5.Final) 运行的 WebAppilcation,用户尝试在其中保存一个新实体。因此会有几个电话,如:

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();
   }
}

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

大多数情况下这会运行良好并且索引会被更新。

但有时,不知道为什么,会出现以下异常,因此索引不会更新:

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 的实体。那么可能存在并发效应?

感谢任何提示和帮助。如果您需要更多信息,请询问,我会提供。谢谢。

【问题讨论】:

  • 我在persistence.xml中没有进一步的配置,所以有同事告诉我,我可以试试:´ 如果这有帮助,我会回来报告。由于该错误是不可引发的,因此这可能需要一段时间。

标签: hibernate jpa hibernate-search


【解决方案1】:

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

您说“不同线程、应用程序或其他任何东西都没有使用索引”,但您还建议这是一个 Web 应用程序,因此它很可能需要对您无法控制的事件做出反应,即使您没有没想到会这样。

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

实际上,您正在运行多个 Hibernate Search 副本,并为获得排他索引锁而战。

我建议永远不要禁用锁定机制:它旨在保护您免受类似错误的影响。它默认启用是有充分理由的。

我还建议使用一些标准方法来初始化 Hibernate 和/或 JPA,任何流行的 JavaEE 容器(如WildFly)或框架都可能“正确”,一些最先进的可以自动启用一些疯狂的优化。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多