[WLS] Connection Initialization Callback on WLS Datasource

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

WebLogic Server 12.2.1.1がダウンロードできるようになりました。一般提供の発表に関するエントリは以下をどうぞ。
Oracle WebLogic Server 12.2.1.1 is Now Available
https://blogs.oracle.com/WebLogicServer/entry/oracle_weblogic_server_12_22https://orablogs-jp.blogspot.jp/2016/06/oracle-weblogic-server-12211-is-now.html
One of the WebLogic Serverデータソースの機能の一つで、接続初期化中に呼び出されるコールバックを定義することができます。ただ、登場して長いにもかかわらずあまり取り上げられませんでした。コールバックの当初の目的は、Application Continuity (AC) 機能と共に使われるメカニズムを提供することでした。これを使うと、接続が予約されていたり、後ほど接続を再生する場合、アプリケーションにとって同じ接続初期化を保証することができる、というものです。後者の場合、元の接続に「リカバリ可能」なエラーがあって閉じられ、その陰で新規接続が予約され、元の接続に対してなされた操作の全てが新規接続で再生されます。コールバックを使うと、アプリケーションが必要とする任意の状態を使って再度接続を初期化することができます。

アプリケーションソフトウェア内でgetConnection()を呼び出した任意の箇所にこの処理を散乱させずに、コールバックを使って全ての接続を初期化することができるというこのコンセプトは、再生を使わなかったとしても非常に便利です。実際には、コールバックをデータソース記述子で構成することができるので(この方法をお薦めします)、コールバックを記述する以外にアプリケーションへの変更はありません。

以下でこの機能のサポートの歴史をまとめました。接続の初期化コールバックを設定している前提で、以下をサポートしていました。
WLS Version Description
10.3.6 リプレイドライバを使って実行する場合にActiv GridLinkデータソースでのみ呼び出される(リプレイはActive GridLink for RACでのみサポート)
12.1.1/12.1.2/12.1.3 リプレイドライバと任意のデータソースタイプを使っている場合に呼び出される(リプレイのサポートが汎用データソースにも追加されたため)
12.2.1 Oracleドライバと任意のデータソースタイプを使って呼び出される
12.2.1.1 任意のドライバ、任意のデータソースタイプを使って呼び出される。Oracleドライバだけに制限する理由はないですね。
Javaコード中でデータソースにコールバックを登録することで、アプリケーションにコールバックを構成することができますが、データソース毎にこれを1回だけ実施する必要があります。データソース構成で登録するほうがずっと簡単だと思います。

以下はコールバックのサンプルです。
package demo;
import oracle.ucp.jdbc.ConnectionInitializationCallback;

public class MyConnectionInitializationCallback implements
  ConnectionInitializationCallback { 
  public MyConnectionInitializationCallback()  { 
  }
  public void initialize(java.sql.Connection connection)
    throws java.sql.SQLException {
     // Re-set the state for the connection, if necessary
  }
}
以下は、できるだけデフォルトのものを使って登録しているコールバックを表示する、シンプルなJythonスクリプトです。
import sys, socket
hostname = socket.gethostname()
connect("weblogic","welcome1","t3://"+hostname+":7001")
edit()
dsname='myds'
jndiName='myds'
server='myserver'
cd('Servers/'+server)
target=cmo
cd('../..')
startEdit()
jdbcSR = create(dsname, 'JDBCSystemResource')
jdbcResource = jdbcSR.getJDBCResource()
jdbcResource.setName(dsname)
dsParams = jdbcResource.getJDBCDataSourceParams()
dsParams.addJNDIName(jndiName)
driverParams = jdbcResource.getJDBCDriverParams()
driverParams.setUrl('jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=dbhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=otrade)))')
driverParams.setDriverName('oracle.jdbc.OracleDriver')
driverParams.setPassword('tiger')
driverProperties = driverParams.getProperties()
userprop = driverProperties.createProperty('user')
userprop.setValue('scott')
oracleParams = jdbcResource.getJDBCOracleParams()
oracleParams.setConnectionInitializationCallback('demo.MyConnectionInitializationCallback')  # register the callback
jdbcSR.addTarget(target)
save()
activate(block='true')
ここではいくつか注目すべき点があります。まず、構成を使用してコールバックを登録するには、クラスがクラスパスになければなりません。とにかく、実行するには、サーバーのクラスパスにある必要がありますが、設定のために早く取得する必要があります。第二に、この機能の経緯から、接続パラメータではなくOracleのパラメータに設定が含まれています。そのため、我々は構成できることはそれほど多くありません。(Oracleタブに加えて)以下の図に示すように、WebLogic Server 12.2.1.1管理コンソールでは、[接続プール]の詳細パラメータでエントリを確認し、設定することができます。最後に、インタフェースはユニバーサル接続プール(UCP)インターフェイスであることにご注意ください。このコールバックをUCPアプリケーションで共有することができます(全てのドライバタイプをDatabase 12.1.0.2以降でサポートしています)。

この機能は管理ガイドのApplication Continuityの章に記載があります。
Oracle® Fusion Middleware Administering JDBC Data Sources for Oracle WebLogic Server 12c (12.2.1.1)
Advanced Configurations for Oracle Drivers and Databases
Application Continuity > Configuring Application Continuity > Using a Connection Callback
http://docs.oracle.com/middleware/12211/wls/JDBCA/ds_oracledriver.htm#CCHFJDHF
このエントリでは、コールバックを使って実際に何もしなかったことに失望されているかもしれませんが、次回のエントリで、別の新しいWLS12.2.1.1の機能でどのように使われているかを示すために再びこのコールバックを使用する予定です。

0 件のコメント:

コメントを投稿