linux - Lucene 索引器在 Windows 上工作,在 Linux 上失败

标签 linux windows lucene hibernate-search

我有一个在 Jetty 9.2 上运行的 java 应用程序。两者都使用相同版本的 Jetty。索引器在应用程序部署后首次启动时运行。我在 Netbeans 中的 Windows 10 开发箱上没有遇到任何问题。当我把它放在 linux 机器上时它不起作用,我只有 SSH 访问权限和有限的权限。

java代码,Person类先运行,Organization类后运行。都在同一个休眠 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: NativeFSLock@/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: NativeFSLock@/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)。

[jetty@server 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
[jetty@server org.vtarc.CyberConnections.backend.entity.Person]$ cd ../org.vtarc.CyberConnections.backend.entity.Organization/
[jetty@server 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 Search真的很老了。您可能遇到了一个错误,此后已解决。我知道有几个与锁定相关的错误已经解决,例如这个:https://stackoverflow.com/a/46284827/6692043

关于linux - Lucene 索引器在 Windows 上工作,在 Linux 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46857360/

相关文章:

ruby-on-rails - elasticsearch nGram/edgengram 部分匹配?

c++ - 确定 NFS 服务器中已提交作业的状态

regex - unix:如何判断字符串是否与正则表达式匹配

java - 快速搜索,无需标记化

.net - 如何在 Windows 上查询打印队列

c++ - 引起问题的反斜杠c++

java - 想要将数据库中的数据存储在 lucene 索引文件中并检索表信息和数据

c - 在 c 中实现一个简单的 shell - wc 命令不起作用

linux - 将多个文本文件附加到单个文件中的脚本

windows - OneDrive Personal(免费)在非 Office 文件上的版本控制?