的Lucene索引适用于Windows,Linux上的

问题描述:

失败,我有码头9.2上运行的Java应用程序。两者都使用相同版本的Jetty。索引器在部署后首次运行应用程序。我在Netbeans的Windows 10开发箱中没有遇到任何问题。当我把它放在一台linux机器上时,它不工作,我只有SSH访问权和有限权限。的Lucene索引适用于Windows,Linux上的

Java代码,类人首先运行,类组织运行第二。无论是在同一个Hibernate Session

public static void reindexViaMassIndexer(Class<?> type, SessionFactory factory) { 
    Session session = factory.getCurrentSession(); 
    FullTextSession fullTextSession = Search.getFullTextSession(session); 
    MassIndexerProgressMonitor monitor = new SimpleIndexingProgressMonitor(); 

    try { 
     fullTextSession 
       .createIndexer(type) 
       .typesToIndexInParallel(1) 
       .batchSizeToLoadObjects(BATCH_SIZE) 
       .cacheMode(CacheMode.NORMAL) 
       .threadsToLoadObjects(10) 
       .idFetchSize(BATCH_SIZE) 
       .progressMonitor(monitor) 
       .startAndWait(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(HibernateLuceneIndexer.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

POM文件

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-search-orm</artifactId> 
     <version>5.2.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-c3p0</artifactId> 
     <version>4.3.9.Final</version> 
    </dependency> 

错误输出

17:48:00,188 ERROR LogErrorHandler:67 - HSEARCH000058: Exception occurred org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/tmp/cyberdex_files/org.vtarc.CyberConnections.backend.entity.Organization/write.lock: java.nio.channels.OverlappingFileLockException 
Primary Failure: 
    Entity org.vtarc.CyberConnections.backend.entity.Organization Id null Work Type org.hibernate.search.backend.PurgeAllLuceneWork 

org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: [email protected]/tmp/cyberdex_files/org.vtarc.CyberConnections.backend.entity.Organization/write.lock: java.nio.channels.OverlappingFileLockException 
    at org.apache.lucene.store.Lock.obtain(Lock.java:89) 
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:755) 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:131) 
    at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:97) 
    at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:112) 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:81) 
    at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:47) 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.applyChangesets(SyncWorkProcessor.java:145) 
    at org.hibernate.search.backend.impl.lucene.SyncWorkProcessor$Consumer.run(SyncWorkProcessor.java:135) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.nio.channels.OverlappingFileLockException 
    at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) 
    at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152) 
    at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1108) 
    at java.nio.channels.FileChannel.tryLock(FileChannel.java:1155) 
    at org.apache.lucene.store.NativeFSLock.obtain(NativeFSLockFactory.java:169) 
    at org.apache.lucene.store.Lock.obtain(Lock.java:96) 
    ... 9 more 

人指数成功,组织失败。注意父目录也是jetty:jetty(user:group)。

[[email protected] org.vtarc.CyberConnections.backend.entity.Person]$ ls -l 
-rw-r-----. 1 jetty jetty 1844 Oct 20 18:43 _9.fdt 
-rw-r-----. 1 jetty jetty 67 Oct 20 18:43 _9.fdx 
-rw-r-----. 1 jetty jetty 1310 Oct 20 18:43 _9.fnm 
-rw-r-----. 1 jetty jetty 3687 Oct 20 18:43 _9_Lucene41_0.doc 
-rw-r-----. 1 jetty jetty 4310 Oct 20 18:43 _9_Lucene41_0.pos 
-rw-r-----. 1 jetty jetty 20500 Oct 20 18:43 _9_Lucene41_0.tim 
-rw-r-----. 1 jetty jetty 576 Oct 20 18:43 _9_Lucene41_0.tip 
-rw-r-----. 1 jetty jetty 1530 Oct 20 18:43 _9.nvd 
-rw-r-----. 1 jetty jetty 171 Oct 20 18:43 _9.nvm 
-rw-r-----. 1 jetty jetty 386 Oct 20 18:43 _9.si 
-rw-r-----. 1 jetty jetty 102 Oct 20 18:43 segments_a 
-rw-r-----. 1 jetty jetty 36 Oct 20 18:43 segments.gen 
-rw-r-----. 1 jetty jetty  0 Oct 20 14:31 write.lock 
[[email protected] org.vtarc.CyberConnections.backend.entity.Person]$ cd ../org.vtarc.CyberConnections.backend.entity.Organization/ 
[[email protected] org.vtarc.CyberConnections.backend.entity.Organization]$ ls -l 
-rw-r-----. 1 jetty jetty 53 Oct 20 15:40 segments_5 
-rw-r-----. 1 jetty jetty 36 Oct 20 15:40 segments.gen 
-rw-r-----. 1 jetty jetty 0 Oct 20 14:31 write.lock 

还需要什么吗?

一个可能的解释是,你是为相同的配置创建多个SessionFactories/EntityManagerFactories,从而实例Hibernate Search的多次和创建的索引文件锁冲突。如果是这样,那么不要。也Hibernate search: persist causes sometimes OverlappingFileLockException

看到另外一个可能的解释:这个版本的Hibernate搜索的是真的老了。您可能遇到自此以后解决的错误。我知道有几个与锁已经解决的错误有关,例如这个:https://stackoverflow.com/a/46284827/6692043

+0

虽然我在两个地方创建了一个Hibernate Session,第一个发生在servlet初始化并且在索引器完成后关闭。直到主UI稍后初始化,第二个会话才开始。这一个留在范围内。 – AFowler

+0

它似乎是它的任一选项2号或一些竞赛条件。我改变了日志从信息调试和一切工作。所以,更多日志会导致应用程序运行速度稍慢,这使得所有事情都能以成功的方式发生。等待另一项测试,看看这个理论是否正确。 – AFowler

+0

@AFowler请注意,我说的是会话*工厂*不会话。并行使用多个会话应该可以正常工作,但使用相同索引的多个SessionFactory不会。我说:“*应*做工精细”,因为我已经讲过了,这是一个老版本的Hibernate Search的,并可能是马车。 –