2017-08-09 74 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和球衣的橋樑。我也會更新這個問題 –