[WLS] Closed JDBC Object Profiling for WLS 12.2.1 Datasource

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/closed_jdbc_object_profiling_for

クローズ済みのJDBCオブジェクトへのアクセスはよくあるアプリケーションエラーで、デバッグが難しいものです。そのような条件を診断するのに役立つ、新たなプロファイリングオプションがあります。これはclose()メソッドを呼び出してからConnection、Statement、ResultSetなどのJDBCオブジェクトにアクセスした場合に診断ログメッセージを生成します。

クローズ済みJDBCオブジェクトプロファイリングを有効化するには、データソースのProfileType属性のビットマスクは0x000400が設定されている必要があります。

以下は値を設定するためのWLSTスクリプトの例です。
# java weblogic.WLST prof.py
import sys, socket, os
hostname = socket.gethostname()
datasource='ds'
svr='myserver'
connect("weblogic","welcome1","t3://"+hostname+":7001")
# Edit the configuration to set the leak timeout
edit()
startEdit()
cd('/JDBCSystemResources/' + datasource + '/JDBCResource/' + datasource +
'/JDBCConnectionPoolParams/' + datasource )
cmo.setProfileType(0x000400) # turn on profiling
save()
activate()
exit()
管理コンソールでは、診断タブの[クローズされた使用のプロファイル]のチェックボックスをONにする必要があります。

このクローズされた使用のログレコードには、2個のスタックトレースが含まれています。クローズ済みの利用ログレコードには次の2つのスタックトレースが含まれています。一つは最初にオブジェクトを閉じたスレッドのもの、もう一つは閉じたオブジェクトにアクセスしようとしたスレッドのものです。レコードの例を以下に示します。
####<mydatasource> <WEBLOGIC.JDBC.CLOSED_USAGE> <Thu Apr 09 15:19:04 EDT 2015> <java.lang.Throwable: Thread[[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]
at weblogic.jdbc.common.internal.ProfileClosedUsage.saveWhereClosed(ProfileClosedUsage.java:31)
at weblogic.jdbc.wrapper.PoolConnection.doClose(PoolConnection.java:242)
at weblogic.jdbc.wrapper.PoolConnection.close(PoolConnection.java:157)
...
> <java.lang.Throwable: Thread[[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads]
at weblogic.jdbc.common.internal.ProfileClosedUsage.addClosedUsageProfilingRecord(ProfileClosedUsage.java:38)
at weblogic.jdbc.wrapper.PoolConnection.checkConnection(PoolConnection.java:83)
at weblogic.jdbc.wrapper.Connection.preInvocationHandler(Connection.java:106)
at weblogic.jdbc.wrapper.Connection.createStatement(Connection.java:581)
...
> <[partition-id: 0] [partition-name: DOMAIN] >
このプロファイルオプションを有効にすると、オブジェクトがすでにクローズされていることを示す例外に、どこでクローズが発行されたのかを示すネストされたSQLExceptionが含まれています。以下がその例です。
java.sql.SQLException: Connection has already been closed.
at weblogic.jdbc.wrapper.PoolConnection.checkConnection(PoolConnection.java:82)
at weblogic.jdbc.wrapper.Connection.preInvocationHandler(Connection.java:107)
at weblogic.jdbc.wrapper.Connection.createStatement(Connection.java:582)
at Application.doit(Application.java:156)
...
Caused by: java.sql.SQLException: Where closed: Thread[[ACTIVE] ExecuteThread: ...
at weblogic.jdbc.common.internal.ProfileClosedUsage.saveWhereClosed(ProfileClosedUsage.java:32)
at weblogic.jdbc.wrapper.PoolConnection.doClose(PoolConnection.java:239)
at weblogic.jdbc.wrapper.PoolConnection.close(PoolConnection.java:154)
at Application.doit(Application.java:154)
... 
接続がすでにクローズされたことを示すエラーが出てどこでそれが起こったのかわからないときに、この機能は非常に有用です。スタックトレースを出力するためのオーバーヘッドがあるため、通常は本番環境でこのオプションを有効にしたままにしないでおきましょう(そのためデフォルトで有効にはなっていません)。とはいえ、問題を解決が必要であれば、このオーバーヘッドには価値があります。

0 件のコメント:

コメントを投稿