1

Hibernate 4.2.0.Final を使用し、(persistence.xml でプロパティ hibernate.cache.use_query_cache を「true」に設定することにより) クエリキャッシュを有効にするアプリケーションを JBoss EAP 6.1 Final にデプロイしています。

JBoss を起動してアプリケーションをデプロイした後、jboss-eap-6.1.0\bin\jconsole.bat を開き、ローカルで JBoss プロセスに接続して MBeans タブに移動すると、空白のタブしか表示されません。通常登録されている基本的な MBean (jboss.* や java.lang.* MBean など) も表示されません。

persistence.xml を変更して "hibernate.cache.use_query_cache" を "false" に設定するだけで (または、最終的に同じ効果を持つプロパティを削除することで)、すべてが正常に機能することに気付きました。つまり、MBean を表示および管理できます。 JConsole から。

Hibernate コードまたは JBoss コードのバグ (存在する場合) かどうかはわかりませんが、いずれにせよ、これを修正するためにどこを見ればよいかわかりません。両方の機能 (JBoss EAP インストールで配布される JConsole を介した Hibernate クエリキャッシュと MBeans 管理) を機能させるのを手伝ってくれる人はいますか?

問題を切り分けて再現するために、この問題を再現するために必要な最小限のリソースを使用して単純な EAR を作成し、JBoss フォーラムで開かれたディスカッションに添付しましたが、これまでのところうまくいきませんでした。興味のある方は、URL はhttps://community.jboss.org/thread/233421です。

4

2 に答える 2

0

これが役立つかどうかはわかりませんが、次のとおりです。

EAR をデプロイするとき、EAP は で NumberFormatException をスローしModule "deployment.HibernateMBeanBug.ear.HibernateMBeanBug-persistence.jar:main" from Service Module Loader、「メイン」部分が数値であると想定します。JConsole アクセスでは、MBean の反復時に NullPointerException がスローされます。

次の行にあります。

doIterate(child, childAddress);

MBean を検出するとき。child = null および childAddress=

[
    ("deployment" => "HibernateMBeanBug.ear"),
    ("subdeployment" => "HibernateMBeanBug-persistence.jar"),
    ("subsystem" => "jpa"),
    ("hibernate-persistence-unit" => "HibernateMBeanBug.ear/HibernateMBeanBug-persistence.jar#AnyPU"),
    ("entity-cache" => "org.hibernate.cache.spi.UpdateTimestampsCache")
]

次に、次の反復で「子」の子を要求すると、NPE にヒットします。

どちらの例外も、デバッガーでキャッチできます。NPE のスタック トレースは次のとおりです。

Daemon System Thread [RMI TCP Connection(24)-192.168.11.2] (Suspended (exception NullPointerException)) 
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 49   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.doIterate(Resource, PathAddress) line: 55   
    RootResourceIterator<T>.iterate() line: 39  
    ModelControllerMBeanHelper.queryNames(ObjectName, QueryExp) line: 144   
    ModelControllerMBeanServerPlugin.queryNames(ObjectName, QueryExp) line: 166 
    PluggableMBeanServerImpl.queryNames(ObjectName, QueryExp) line: 308 
    RMIConnectionImpl.doOperation(int, Object[]) line: 1506 
    RMIConnectionImpl.access$300(RMIConnectionImpl, int, Object[]) line: 97 
    RMIConnectionImpl$PrivilegedOperation.run() line: 1328  
    RMIConnectionImpl.doPrivilegedOperation(int, Object[], Subject) line: 1420  
    RMIConnectionImpl.queryNames(ObjectName, MarshalledObject, Subject) line: 590   
    NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 606  
    UnicastServerRef2(UnicastServerRef).dispatch(Remote, RemoteCall) line: 322  
    Transport$1.run() line: 177 
    Transport$1.run() line: 174 
    AccessController.doPrivileged(PrivilegedExceptionAction<T>, AccessControlContext) line: not available [native method]   
    TCPTransport(Transport).serviceCall(RemoteCall) line: 173   
    TCPTransport.handleMessages(Connection, boolean) line: 556  
    TCPTransport$ConnectionHandler.run0() line: 811 
    TCPTransport$ConnectionHandler.run() line: 670  
    ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1145  
    ThreadPoolExecutor$Worker.run() line: 615   
    Thread.run() line: 724  

org.hibernate.cache.spi.UpdateTimestampsCache は にあるjboss-eap-6.1\modules\system\layers\base\org\hibernate\main\hibernate-core-4.2.0.CR1.jarため、更新するだけでこの問題を解決できる場合があります。

少なくとも問題は完全に再現可能であるため、issues.jboss.orgに問題を報告します。

更新: jar を 4.2.6.Final に更新してテストしましたが、問題は解決しませんでした。

更新 2:

persistence.xml の第 2 レベル キャッシュに追加すると、次のようになります。

<property name="hibernate.cache.use_second_level_cache" value="true" />

問題は解決します。どうやら、query_cache を有効にしている場合、MBean 反復ロジックはエンティティ キャッシュ (第 2 レベルのキャッシュ) も検出することを想定しており、定義されていない場合は NPE をスローします。値が「false」の場合、問題は解決しないため、有効にする必要があります。

以上はあくまでも推測ですので、的外れかもしれません。ただし、二次キャッシュを追加すると、何らかの理由でうまくいくようです。

于 2013-10-18T16:21:18.813 に答える