2017-08-09 5 views
0

私はHibernate Searchにとても新しいので、それを自分のアプリケーションと統合しようとしています。 メモリリークの問題が発生しました(スレッドは待機/待機状態になります)。Hibernateの検索設定の問題

Hibernate検索構成(非常に最小限)はアノテーション駆動です。使い方:

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

@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 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)

私は春は、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のシャットダウン時に自動的に行われ、シャットダウン時にこのスレッドを自動的に停止する必要があります。

この警告には、Hibernate ORMがまだシャットダウンしていたときにTomcatがスレッドをチェックしたか、またはHibernate ORMをまったく停止しなかったという2つの理由があります。

私は、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

私が述べたように、設定はアノテーション駆動です。私は@PersistenceContextを使ってエンティティマネージャをautowireしています。 JPAの設定には、Hibernateの2つのプロパティ(例えば、show-sql)だけが含まれています。言及すると、SpringとJerseyを統合するブリッジとしてSpring Servletを使用しています。私も質問を更新します –