https://blogs.oracle.com/WebLogicServer/entry/connection_leak_profiling_for_wls
これはWebLogic Server 12.2.1におけるデータソース・プロファイリングの機能向上に関する3部作の一個目のエントリです。これらの機能向上はお客様ならびにOracle Supportからの要求でした。この機能はアプリケーションで問題を見つけ出す上で非常に役に立つと思います。
12.2.1までの接続リーク診断プロファイリングオプションでは、アイドルの予約済み接続がリークしていると判断するまでの時間として、接続プールの「非アクティブ接続タイムアウト」属性を正数(0では無効になります)に設定する必要があります。リークしていると判断した場合、接続が再利用され、予約スレッドに関する情報を診断ログに書き出します。長時間接続を保持するアプリケーションでは、後検出によりデバッグが複雑なアプリケーションエラーが発生する場合があります。この問題に対処し、使い勝手を向上させるために、接続リークプロファイリングの2つの機能拡張が使えるようになりました。
- 接続プールが最大容量に到達し、確保要求がPoolLimitSQLExceptionエラーになった場合に、すべての予約済み接続に対して接続リークプロファイルレコードを作成します。
- 接続がいつリークしていると判断するかを決定する際に利用するため、データソースディスクリプタにオプションのConnection Leak Timeout Seconds(接続リークタイムアウト)という属性を追加します。アイドル接続がタイムアウト値を上回った場合、リークプロファイルログメッセージを書き込み、接続をそのままにしておきます。
以下は値を設定する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.setProfileConnectionLeakTimeoutSeconds(120) # set the connection leak timeout cmo.setProfileType(0x000004) # turn on profiling save() activate() exit()
ProfileConnectionLeakTimeoutSeconds属性もしくはプールの容量を超えた場合のいずれかがトリガーになっているリーク用に、既存のリーク検出診断プロファイリングログレコード形式を使います。いずれの場合も、各予約接続に対して一回だけログレコードを生成します。その後接続をプールに解放し、再度予約して再びリークする場合、新たなレコードが生成されます。リソースリーク診断ログレコードの例を以下に示します。コンソールやデータソースプロファイル出力テキストファイルから出力を確認することができます。
接続のリークがあって、しかも有効な長時間実行する操作を有する可能性のあるアプリケーションでは、通常のアプリケーション実行に干渉せず、問題がある可能性のある接続のリストに目を通すことができます。####<mydatasource> <WEBLOGIC.JDBC.CONN.LEAK> <Thu Apr 09 14:00:22 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) ... > <autoCommit=true,enabled=true,isXA=false,isJTS=false,vendorID=100,connUsed=false,doInit=false,'null',destroyed=false,poolname=mydatasource,appname=null,moduleName=null, connectTime=960,dirtyIsolationLevel=false,initialIsolationLevel=2,infected=false,lastSuccessfulConnectionUse=1428602415037,secondsToTrustAnIdlePoolConnection=10, currentUser=...,currentThread=Thread[[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)',5,Pooled Threads],lastUser=null,currentError=null,currentErrorTimestamp=null,JDBC4Runtime=true,supportStatementPoolable=true,needRestoreClientInfo=false,defaultClientInfo={}, supportIsValid=true> <[partition-id: 0] [partition-name: DOMAIN] >
0 件のコメント:
コメントを投稿