原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/closed_jdbc_object_profiling_for
クローズ済みのJDBCオブジェクトへのアクセスはよくあるアプリケーションエラーで、デバッグが難しいものです。そのような条件を診断するのに役立つ、新たなプロファイリングオプションがあります。これはclose()メソッドを呼び出してからConnection、Statement、ResultSetなどのJDBCオブジェクトにアクセスした場合に診断ログメッセージを生成します。
クローズ済みJDBCオブジェクトプロファイリングを有効化するには、データソースのProfileType属性のビットマスクは0x000400が設定されている必要があります。
以下は値を設定するためのWLSTスクリプトの例です。
このクローズされた使用のログレコードには、2個のスタックトレースが含まれています。クローズ済みの利用ログレコードには次の2つのスタックトレースが含まれています。一つは最初にオブジェクトを閉じたスレッドのもの、もう一つは閉じたオブジェクトにアクセスしようとしたスレッドのものです。レコードの例を以下に示します。
https://blogs.oracle.com/WebLogicServer/entry/closed_jdbc_object_profiling_for
クローズ済みのJDBCオブジェクトへのアクセスはよくあるアプリケーションエラーで、デバッグが難しいものです。そのような条件を診断するのに役立つ、新たなプロファイリングオプションがあります。これはclose()メソッドを呼び出してからConnection、Statement、ResultSetなどのJDBCオブジェクトにアクセスした場合に診断ログメッセージを生成します。
クローズ済みJDBCオブジェクトプロファイリングを有効化するには、データソースのProfileType属性のビットマスクは0x000400が設定されている必要があります。
以下は値を設定するためのWLSTスクリプトの例です。
管理コンソールでは、診断タブの[クローズされた使用のプロファイル]のチェックボックスをONにする必要があります。# 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()
このクローズされた使用のログレコードには、2個のスタックトレースが含まれています。クローズ済みの利用ログレコードには次の2つのスタックトレースが含まれています。一つは最初にオブジェクトを閉じたスレッドのもの、もう一つは閉じたオブジェクトにアクセスしようとしたスレッドのものです。レコードの例を以下に示します。
このプロファイルオプションを有効にすると、オブジェクトがすでにクローズされていることを示す例外に、どこでクローズが発行されたのかを示すネストされたSQLExceptionが含まれています。以下がその例です。####<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] >
接続がすでにクローズされたことを示すエラーが出てどこでそれが起こったのかわからないときに、この機能は非常に有用です。スタックトレースを出力するためのオーバーヘッドがあるため、通常は本番環境でこのオプションを有効にしたままにしないでおきましょう(そのためデフォルトで有効にはなっていません)。とはいえ、問題を解決が必要であれば、このオーバーヘッドには価値があります。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)
...