Hibernate搜索配置问题

时间:2017-08-09 12:53:10

标签: java spring multithreading lucene hibernate-search

我是Hibernate Search的新手,并尝试将其与我的应用程序集成。 面临内存泄漏问题(线程进入等待/停放状态)。

Hibernate Search配置(非常小)是注释驱动的。使用:

@Indexed(index = "<index_name>")
@IndexedEmbedded

AND

@Field(name = "title", store = Store.YES, analyzer = @Analyzer(definition = "standardAnalyzer")

Hibernate搜索属性:

<property name="hibernate.search.default.indexBase" value="../lucene/indexes" />
<property name="hibernate.search.default.directory_provider" value="filesystem" /> 
<property name="hibernate.search.default.exclusive_index_use"
            value="false" />

使用Tomcat 8部署应用程序。

我的主要问题是

VisualVm清楚地表明Hibernate搜索为每个索引创建了一个同步消费者线程。它对我对我的服务器进行的每次调用都这样做(在我的情况下,每次调用时会生成2个新线程并处于驻留状态)。最终线程数量增加,直到我的服务器无响应。

在服务器关闭时,我收到错误:

  

09-Aug-2017 17:15:28.151警告[localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads Web应用程序[procurewise]似乎已经启动了一个名为[Hibernate Search sync consumer]的线程索引类别的线程]但未能阻止它。这很可能造成内存泄漏。堆栈跟踪线程:    sun.misc.Unsafe.park(原生方法)    java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:338)    org.hibernate.search.backend.impl.lucene.SyncWorkProcessor.parkCurrentThread(SyncWorkProcessor.java:175)    org.hibernate.search.backend.impl.lucene.SyncWorkProcessor.access $ 300(SyncWorkProcessor.java:35)    org.hibernate.search.backend.impl.lucene.SyncWorkProcessor $ Consumer.run(SyncWorkProcessor.java:147)    java.lang.Thread.run(Thread.java:745)

我正在使用Spring,Hibernate,JPA,AOP和JAX-RS,Jersey。

环境详情:

  

Hibernate版本5.2.10.Final

     

Hibernate Search版本5.7.0.Final

     

Spring version 4.3.6.RELEASE

     

JPA 2.1

     

JAVA 8

     

Jersey 1.8

1 个答案:

答案 0 :(得分:0)

当Hibernate Search关闭时,该线程应自动停止,这在Hibernate ORM关闭时会自动发生。

我发现这个警告有两个原因:Tomcat在Hibernate ORM仍然关闭的情况下检查了线程,或者你根本没有停止Hibernate ORM。

我建议检查你的关机过程,看看Hibernate ORM是否正确关闭(通常你使用org.hibernate.SessionFactory.close(),但我希望Spring能够自己处理),如果是的话,看看它是否同步关闭(这样你的Tomcat只会在完成所有关闭后执行检查)。