2017-08-09 73 views
0

我对Hibernate Search非常陌生,并试图将其与我的应用程序集成。 面对内存泄漏问题(线程进入等待/停泊状态)。Hibernate搜索配置问题

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

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

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

Hibernate Search的性质:

<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 Search的创建各项指标同步消费者线程。它为我对服务器进行的每一个调用都这样做(在我的情况下,每次调用都会产生2个新线程并处于停放状态)。最终,线程的数量会增加,直到我的服务器无响应。

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

09-Aug-2017 17:15:28.151 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [procurewise] appears to have started a thread named [Hibernate Search sync consumer thread for index Category] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: sun.misc.Unsafe.park(Native Method) 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,新泽西州。

环境细节:

Hibernate version 5.2.10.Final

Hibernate Search version 5.7.0.Final

Spring version 4.3.6.RELEASE

JPA 2.1

JAVA 8

Jersey 1.8

+0

这是不相关的,但你不应该使用'hibernate.search.default.exclusive_index_use',除非你真的知道你为什么需要它。真。另外,你使用的是什么版本的Hibernate Search? –

+0

@YoannRodière。我已经添加了我正在使用的Hibernate搜索版本。此外,exclusive_index_use属性试图停止使用锁假设MassIndexer衍生多个线程,我认为这是问题在这里。但要指出的一点。 –

回答

0

当Hibernate Search的关闭,当Hibernate ORM关闭其自动发生此线程应该自动停止。

我看到了这个警告的两个原因:Tomcat在Hibernate ORM仍然关闭时检查了线程,或者根本没有停止Hibernate ORM。

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

+0

这里我的问题不是tomcat在关机时给出的警告/错误。问题在于,对于每次调用,都会产生2个新线程并置于停放状态。随着时间的推移,有太多的线程,我的服务器变得无法响应。它是 –

+0

@HarshvardhanDudeja从你告诉我,你似乎创建一个Hibernate ORM SessionFactory为每个电话到您的服务器,甚至没有关闭它。不管你是否使用Hibernate Search,这真的很糟糕。你应该检查你的Hibernate ORM/JPA配置,尤其是你如何配置与持久相关的bean以及如何获取EntityManager/Session。 –

+0

正如我所提到的配置是由Annotation驱动的。我使用@PersistenceContext自动装载实体管理器。 JPA配置只包含几个Hibernate属性(例如show-sql)。只要提到我使用Spring Servlet作为整合Spring和球衣的桥梁。我也会更新这个问题 –