[WLS] Local Transaction Leak Profiling for WLS 12.2.1 Datasource

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

これは、WebLogic Server 12.2.1のプロファイリングの機能強化に関する一連のエントリの三個目です。
これは、アプリケーションがローカルトランザクションを開いたままにして接続プールに戻された場合によくあるアプリケーションエラーで、診断が困難なものです。このエラーは、XAException/XAER_PROTO、またはデータベースのアップデートの意図せぬローカルトランザクションのコミットやロールバックとして現れることがあります。接続がリリースされた場合のローカルトランザクションの内部のコミット、ロールバックに対する現在の回避策は、アプリケーションに現れるエラーをマスクするだけでしかなく、まだデータの矛盾の可能性が残っています。
Oracle JDBC thin driverはローカルトランザクションの接続の状態を取得する独自の方法をサポートしていますが、接続プールにリリースされた時に接続でローカルトランザクションを検知した場合にログエントリを追加する、新しいプロファイリングオプションが追加されています。ログレコードにはコールスタックと接続をリリースしたスレッドに関する詳細情報が含まれています。

ローカルトランザクションのリークプロファイリングを有効化するためには、データソース接続プールのProfileType 属性のビットマスクに0x000200 という値を含める必要があります。

以下は値を設定するための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(0x000200) # turn on  transaction leak profiling
save()
activate()
exit()
プロファイルタイプを設定する場合、複数のプロファイルオプションを一緒に組み合わせることができます。

管理コンソールでは診断タブで、接続ローカル・トランザクション・リークのプロファイル(Profile Connection Local Transaction Leak)のチェックボックスを使って有効化できます。

ローカルトランザクション・リークプロファイルのレコードには2個のスタックトレースが含まれています。一つは予約しているスレッドからのもの、もう一つは接続がクローズされたときのスレッドによるものです。ログレコードの例を以下に示します。
####<mydatasource> <WEBLOGIC.JDBC.CONN.LOCALTX_LEAK> <Thu Apr 09 15:30:11 EDT 2015> <java.lang.Exception
at weblogic.jdbc.common.internal.ConnectionEnv.setup(ConnectionEnv.java:398)
at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:365)
at weblogic.common.resourcepool.ResourcePoolImpl.reserveResource(ResourcePoolImpl.java:331)
at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:568)
at weblogic.jdbc.common.internal.ConnectionPool.reserve(ConnectionPool.java:498)
at weblogic.jdbc.common.internal.ConnectionPoolManager.reserve(ConnectionPoolManager.java:135)
at weblogic.jdbc.common.internal.RmiDataSource.getPoolConnection(RmiDataSource.java:522)
at weblogic.jdbc.common.internal.RmiDataSource.getConnectionInternal(RmiDataSource.java:615)
at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:566)
at weblogic.jdbc.common.internal.RmiDataSource.getConnection(RmiDataSource.java:559)
...
> <java.lang.Exception
at weblogic.jdbc.common.internal.ConnectionPool.release(ConnectionPool.java:1064)
at weblogic.jdbc.common.internal.ConnectionPoolManager.release(ConnectionPoolManager.java:189)
at weblogic.jdbc.wrapper.PoolConnection.doClose(PoolConnection.java:249)
at weblogic.jdbc.wrapper.PoolConnection.close(PoolConnection.java:157)
...
> <[partition-id: 0] [partition-name: DOMAIN] >
レコードを見ると、アプリケーションのどこでクローズが実施されたのかを確認できますので、クローズする前に適切にトランザクションを完了させてください。

0 件のコメント:

コメントを投稿