テスト接続サービス

WebSphere® Application Server では、データ・ソース構成の検証を行うための、テスト接続サービスが提供されています。 testConnection 命令によって、データ・ソース構成をインスタンス化し、接続を取得して、すぐに接続を閉じます。

データ・ソースの定義に WebSphere 変数が含まれる場合は、変数およびデータ・ソースの両方のスコープ設定がテスト接続の結果に与える影響を判断する必要があります。 次のステップとして、テスト接続サービスを活動化する方法を管理コンソール、wsadmin ツール、または Java™ スタンドアロン・プログラムの 3 つの方法からいずれかを選択します。

スコープ設定の検証

WebSphere 変数とデータ・ソース構成を関連付けることにより、テスト接続の結果がアプリケーションの実行時の動作と一致しなくなる場合があります。 場合によっては、テスト接続操作が失敗することがありますが、物理データ・ソースはアプリケーションの実行時は正常に機能します。 潜在的な競合の原因としては、アプリケーション・サーバーが実行時に WebSphere 変数のスコープ設定を処理する方法とテスト接続操作のスコープ設定を処理する方法が異なることが挙げられます。 その違いを理解することにより、データ・ソース構成を正常に作成できるようになります。

実行時に、以下のいずれかの基準が存在するレベルで、 該当する変数を解決することによって、WebSphere Application Server は 物理データ・ソースを呼び出します。
  • 変数のスコープには、データ・ソースの構成を含めることができます。 つまり、より幅広いスコープを持つことになるわけです。
  • 変数とデータ・ソースは、同一のスコープを持ちます。
Application Server は、スコープのスペクトルの各レベルで変数を解決することで、これらの条件を満たします。 つまり、製品は、サーバー・スコープの変数を解決し、 続いてクラスター・スコープ、ノード・スコープ、最後にセル・スコープの変数を解決します。
しかし、Application Server がテストするのは 1 つのスコープの接続だけであり、データ・ソース構成の スコープと同じスコープの JVM 内でテスト操作を行います。この製品は、 そのスコープのみにおいて、ドライバーのクラスパス変数の解決を試みます。
表 1. データ・ソース・スコープとテスト接続 JVM の相関. セル、ノード、クラスターおよびサーバー・データ・ソース・スコープと操作が発生する対応するテスト接続 JVM の相関
データ・ソース・スコープ テスト接続操作が発生する JVM
セル マネージャー・プロセス
ノード (関連するノードの) ノード・エージェント・プロセス
クラスター クラスター・メンバーを含む各ノードのノード・エージェント
サーバー サーバー。 サーバーを使用することができない場合、テスト接続操作は、 アプリケーション・サーバーを含むノードのノード・エージェントで再試行されます。
[z/OS]制約事項: アプリケーション・サーバーの Network Deployment 実装では、ノード・レベル、あるいはクラスター・レベルで以下のデータ・ソースの接続をテストすることはできません。
  • IBM Data Server Driver for JDBC and SQLJ のデータ・ソース (ドライバー・タイプ 2 を使用)
  • DB2 Universal JDBC Driver Provider のデータ・ソース (ドライバー・タイプ 2 を使用)
アプリケーションで使用するためにデータ・ソースのノード・レベルあるいはクラスター・レベルの構成を作成できます。これらの構成は、ランタイム環境で正常に機能します。 ただし、データ・ソース上のテスト接続を正常に実行するには、サーバー・レベルでのみデータ・ソースのテストを行う必要があります。 アプリケーション・サーバーは、ノード・レベルでのテスト接続に対しては、以下の例外を出します。
java.sql.SQLException: Failure in loading T2 native library db2jcct2DSRA0010E: SQL state = null, Error Code = -99,999
ただし、場合によっては、エラーが以下のメッセージのようになる場合があります。
T2zOS exception: [jcc][T2zos]T2zosReusableConnection.flowConnect:initRRSAFAttach
:2528: Connection dead
これらのデータ・ソースは両方とも、タイプ 2 JDBC ドライバーをベースにしており、このドライバーは、T2 ネイティブ・ライブラリーにアクセスする必要があります。 アプリケーション・サーバーのランタイム環境は、サーバー・プロセスでデータ・ソースのアクセスを提供しますが、テスト接続サービスは、ノード・エージェント・プロセスで実行された場合にこれらのネイティブ・ファイルに対するアクセスを提供しません。

したがって、これらのデータ・ソースをノード・スコープあるいはクラスター・スコープで作成する場合は、同一構成をサーバー・スコープで、一時的にテスト目的で作成する場合があります。 サーバー・レベルでテスト接続操作を実行して、データ・ソース設定が構成全体に有効であるかどうかを判別してください。

WebSphere 変数のスコープが データ・ソースのスコープより小さい場合、テスト接続操作は失敗します。 このような失敗と成功が起こるシナリオを、次の表で説明します。
表 2. 異なるデータ・ソースと WebSphere 変数の組み合わせによるテスト接続の結果. 異なるデータ・ソースと WebSphere 変数の組み合わせによるテスト結果を表に示します。
データ・ソース・スコープ セル・レベルの変数 ノード・レベルの変数 サーバー・レベルの変数
セル・レベル OK 失敗 失敗
ノード・レベル OK OK 失敗
サーバー・レベル OK OK OK

予想に反して、 これらのテスト接続の失敗は、一般的にランタイムの障害とは解釈されません。 データ・ソースを使用しなければならない すべてのクライアントが JDBC ドライバー・ファイルの ロケーションにアクセスできることを確認してから、 そのロケーションの絶対パスを使用して WebSphere 変数を構成してください。

しかし、表 2 にリストされたスコープの組み合わせのいずれかで、 逆のシナリオが発生する可能性があります。 つまり、テスト接続操作は成功するものの、 実行時にデータ・ソースで障害が起こる、というものです。 この異常は、セル・スコープ・データ・ソースで、セル・スコープ WebSphere 変数を使用する場合に発生します。デプロイメント・マネージャー・ プロセスで操作が行われるため、 接続テストは成功します (表 1 参照)。 この場合、Application Server はセル・スコープの変数を解決できます。 そのデータ・ソースは、実行時に失敗する可能性があります。 これは、セル・スコープの変数が、 ヌル値によってオーバーライドされるためです。

ノードが作成されると、Application Server は、 サポートされるすべての JDBC ドライバーの環境変数を、 ノード・スコープに作成し、各変数を空ストリングで初期化します。 アプリケーション・サーバーは、 スコープの範囲の下限から上限に向けて変数を解決しようとするため、 ノード・スコープ変数は、実行時にセル・スコープ変数をオーバーライドします。 サーバーは、空ストリングを読み取り、 それを JDBC ドライバー・クラスパスとして受け入れます。 クラスパスがヌルの場合、 サーバーがデータ・ソースの使用を 試みたときに classNotFound 例外が発生します。

以下の Application Server 管理オプションの いずれかを使用すると、ドライバー・クラスパス変数の最終値が 空ストリングにならないようにすることができます。

  • WebSphere Application Server 管理コンソールを使用します。データ・ソース・ウィザード・プログラムによって、セル・スコープ変数の値 (JDBC プロバイダー作成ウィザードで指定したもの) が同じ名前のノード・スコープ変数にコピーされます。このウィザード・プログラムは、 ノード・スコープ変数の値が空ストリングである場合に限り、 このコピー操作を実行します。 したがって、このプログラムでは、 以前に指定された有効なクラスパスの変更は行いません。
    実行時に、データ・ソースがノード・スコープ変数で機能するようにするには、 以下のステップを実行してください。
    1. JDBC ドライバー・ファイルを、デプロイメント・マネージャー・ノードと、 データ・ソースが機能する必要があるすべてのノードに、インストールします。
    2. デプロイメント・マネージャー上のドライバー・ファイル・パスを 使用して、JDBC プロバイダーの WebSphere 変数をセル・スコープに定義します。
    3. データ・ソースがデプロイメント・マネージャーの JDBC プロバイダーに 関連付けられていて、同じセル・スコープを持っていることを確認してください。
      重要: デプロイメント・マネージャー・ノードを含む すべてのノード上で、 同一の絶対パス名を持つロケーションに ドライバー・ファイルをインストールして、 正常に終了することを確認してください。 正常に終了しない場合は、テスト接続が成功しながらも、 実行時に失敗した場合と同じシナリオが、再現されている可能性があります。
  • Using the wsadmin scripting tool: テスト接続操作と 実行時の両方に対してデータ・ソースが機能するようにするには、 セル・スコープとすべての関連したノード・スコープに、 同じドライバー・クラスパス構成を作成します。 以下のステップを実行してください。
    1. JDBC ドライバー・ファイルを、 デプロイメント・マネージャー・ノードにインストールします。 そのパス名を使用して、JDBC プロバイダーのドライバー・クラスパス変数を セル・スコープに定義します。
    2. データ・ソースがデプロイメント・マネージャーの JDBC プロバイダーに 関連付けられていて、同じセル・スコープを持っていることを確認してください。
    3. データ・ソースが機能していなければならない 各ノードに JDBC ドライバー・ファイルをインストールし、 そのパスを使用して、JDBC プロバイダーの WebSphere 変数を ノード・スコープに定義します。 これらのプロバイダーは、それぞれ同じ構成になっています。
      重要: デプロイメント・マネージャー・ノードを含む すべてのノード上で、 同一の絶対パス名を持つロケーションに ドライバー・ファイルをインストールして、 正常に終了することを確認してください。 正常に終了しない場合は、テスト接続が成功しながらも、 実行時に失敗した場合と同じシナリオが、再現されている可能性があります。

データ・ソースへのアクセスを必要とする すべてのノード (デプロイメント・マネージャー・ノードを含む) が、 同じプラットフォームで稼働し、 同じロケーションに JDBC ドライバーがインストールされている場合に限り、 セル・スコープのリソースを使用します。 それ以外の場合は、ノード・スコープを データ・ソースの最大スコープ設定として使用します。

変数ルックアップのバイパス

JDBC プロバイダーのクラスパス・エントリーをハードコーディングした値に変更することにより、環境変数のルックアップをバイパスすることができます。 ただし、この方法が成功するのは、データ・ソースを機能させるすべてのノードで同じようにクラスパスを構成した場合 に限ります。

テスト接続サービスの活動化

テスト接続サービスを活動化するには、管理コンソール、wsadmin ツール、または Java スタンドアロン・プログラムを使用する 3 つの方法があります。各プロセスとも、同じ MBean 上で同じメソッドが起動します。

管理コンソール

WebSphere Application Server では、管理コンソールからボタン操作のみで接続をテストできます。「データ・ソース・コレクション (Data source collection) 」、「データ・ソース設定 (Data source settings) 」、「バージョン 4 データ・ソース・コレクション (Version 4 data source collection) 」、および「バージョン 4 データ・ソース設定 (Version 4 data source settings) 」のすべてのページに「テスト接続 (Test Connection) 」ボタンがあります。 データ・ソースを定義および保存したら、このボタンをクリックして、データ・ソース定義のパラメーターが正しいことを確認できます。 コレクション・ページでは、複数のデータ・ソースを選択し、 それらをすべて一度にテストできます。 最初に一定の条件が満たされていなければならないことに注意してください。 詳しくは、『管理コンソールを使用した接続のテスト』トピックを参照してください。

注: 「テスト接続」をクリックして、 管理コンソールから Sybase データ・ソースに接続すると、 次の例外が発生します。
Test connection failed for data source isagent on server server1 at node 
svtaix24Node01 with the following exception: java.lang.Exception: 
java.sql.SQLException: JZ006: Caught IOException: java.net.ConnectException: A 
remote host refused an attempted connect operation.DSRA0010E: SQL State = JZ006, 
Error Code = 0
Sybase データ・ソースのポート番号が、Sybase サーバーで 構成されたポートと一致しない場合に、この例外が発生します。 デフォルトのポート番号は 5000 です。 /<sybase install directory> の下にある インターフェース・ファイルで、 ご使用の Sybase サーバーのポート番号を確認してください。

WsAdmin ツール

wsadmin ツールは、すべての WebSphere Application Server 管理アクティビティーに対してスクリプト・インターフェースを提供します。 このテスト接続機能は、MBean のメソッドとして実装され、MBean メソッドは wsadmin により呼び出せるため、wsadmin を使用して、データ・ソースとの接続をテストできます。 wsadmin からのデータ・ソース接続のテストには、2 つのオプションがあります。

wsadmin の AdminControl オブジェクトは、 データ・ソース・オブジェクトの構成プロパティーをテストする testConnection 操作を備えています。 詳しくは、『wsadmin を使用した接続のテスト』トピックを参照してください。

また、MBean 操作を起動して接続をテストできます。 この技法のガイドとして、『例: wsadmin を用いたデータ・ソース接続のテスト』トピックを参照してください。

Java スタンドアロン・プログラム

最後に、DataSourceCfgHelper MBean で testConnection メソッドを実行して、接続をテストする方法があります。この方法では、構成されたデータ・ソースの構成 ID を渡すことができます。この Java プログラムは、稼働中の Java Management Extensions (JMX) サーバーに接続して、MBean にアクセスします。Application Server の WebSphere Application Server Network Deployment インストール では、デプロイメント・マネージャーで稼働する JMX サーバーへの接続に、通常はポート 8879 を使用します。

この起動からの戻り値は、0、正数または例外のいずれかです。 0 は、操作が正常に完了し、警告が戻されなかったことを意味します。 正数は、操作が完了したこと、および警告の数を意味します。 例外は、接続のテストが失敗したことを意味します。

注: 例: testConnection(ConfigID) を使用した接続のテスト

以下のコード例ではデータ・ソース・インスタンスと関連接続インスタンスを作成し、それらをテストしてデータベースの接続を確認します。

このプログラムは、JMX を使用して、 稼働中のサーバーとの接続および DataSourceCfgHelper MBean における testConnection メソッドの起動を行ないます。コメント行の頭字語 ND は、以下のコードが WebSphere Application Server WebSphere Application Server Network Deployment に適用されていることを示しています。 コメント行の単語 Base は、以下のコードが WebSphere Application Server に適用されていることを示しています。

/**
 * Description
 * Resource adapter test program to make sure that the MBean interfaces work.
 * Following interfaces are tested
 * 
 *  ---  testConnection()
 * 
 * 
 * We need following to run
 * C:¥src>java -Djava.ext.dirs=C:¥WebSphere¥AppServer¥lib;C:¥WebSphere¥AppServer¥java¥jre¥lib¥ext testDSGUI
 * must include jre for log.jar and mail.jar, else get class not found exception
 * 
 * 
 */

import java.util.Iterator;
import java.util.Locale;
import java.util.Properties;
import java.util.Set;

import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.RuntimeMBeanException;
import javax.management.RuntimeOperationsException;

import com.ibm.websphere.management.AdminClient;
import com.ibm.websphere.management.AdminClientFactory;
import com.ibm.ws.rsadapter.exceptions.DataStoreAdapterException;

public class testDSGUI {

//Use port 8880 for a Base installation or port 8879 for ND installation
String port = "8880";
// String port = "8879";
String host = "localhost";
final static boolean verbose = true;

// eg a configuration ID for DataSource declared at the node level for Base
private static final String resURI = "cells/cat/nodes/cat|resources.xml#DataSource_1";

// eg a 4.0 DataSource declared at the node level for Base
//    private static final String resURI = "cells/cat/nodes/cat|resources.xml#WAS40DataSource_1";

// eg Apache Derby DataSource declared at the server level for Base
//private static final String resURI = "cells/cat/nodes/cat/servers/server1/resources.xml#DataSource_6";

// eg node level DataSource for ND
//private static final String resURI = "cells/catNetwork/nodes/cat|resources.xml#DataSource_1";

// eg server level DataSource for ND
//private static final String resURI = "cells/catNetwork/nodes/cat/servers/server1|resources.xml#DataSource_4";

// eg cell level DataSource for ND
//private static final String resURI = "cells/catNetwork|resources.xml#DataSource_1";

 public static void main(String[] args) {
  testDSGUI cds = new testDSGUI();
  cds.run(args);
 }

/**
 * This method tests the ResourceMbean.
 * 
 * @param args
 * @exception Exception
 */
 public void run(String[] args) {

  try {

		System.out.println("Connecting to the application server.......");

        /*************************************************************************/
        /**    Initialize the AdminClient                                        */
        /*************************************************************************/	
	Properties adminProps = new Properties();
	adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
		adminProps.setProperty(AdminClient.CONNECTOR_HOST, host);
		adminProps.setProperty(AdminClient.CONNECTOR_PORT, port);
	AdminClient adminClient = null;
	try {
	    	    adminClient = AdminClientFactory.createAdminClient(adminProps);
	} catch (com.ibm.websphere.management.exception.ConnectorException ce) {
  	    	    System.out.println("NLS: Cannot make a connection to the application server¥n");
	    	    ce.printStackTrace();
	    System.exit(1);
	}

       /*************************************************************************/
       /**    Locate the Mbean                                                  */
       /*************************************************************************/
	ObjectName handle = null;
	try {
                // Send in a locator string
                // eg for a Base installation this is enough
                ObjectName queryName = new ObjectName("WebSphere:type=DataSourceCfgHelper,*");

                // for ND you need to specify which node/process you would like to test from
                // eg run in the server
//ND: ObjectName queryName = new OjectName
				("WebSphere:cell=catNetwork,node=cat,process=server1,type=DataSourceCfgHelper,*");
                // eg run in the node agent
//ND: ObjectName queryName = new ObjectName
				("WebSphere:cell=catNetwork,node=cat,process=nodeagent,type=DataSourceCfgHelper,*");
//ND: eg run in the   Manager
//ND: ObjectName queryName = new ObjectName
						("WebSphere:cell=catNetwork,node=catManager,process=dmgr,type=DataSourceCfgHelper,*");
	Set s = adminClient.queryNames(queryName, null);
	Iterator iter = s.iterator();
	while (iter.hasNext()) {                                        
                // use the first MBean that is found
	 			 	handle = (ObjectName) iter.next();
		System.out.println("Found this ->" + handle);
		}
		if (handle == null) {
			System.out.println("NLS: Did not find this MBean>>" + queryName);
			System.exit(1);
		}
	} catch (MalformedObjectNameException mone) {
		System.out.println("Check the program variable queryName" + mone);
	} catch (com.ibm.websphere.management.exception.ConnectorException ce) {
		System.out.println("Cannot connect to the application server" + ce);
	}

         /*************************************************************************/
         /**           Build parameters to pass to Mbean                          */
         /*************************************************************************/
		String[] signature = { "java.lang.String" };
		Object[] params = { resURI };
	Object result = null;

       	if (verbose) {
				System.out.println("¥nTesting connection to the database using " + handle);
	}

	try {
               /*************************************************************************/
               /**  Start to test the connection to the database                        */
               /*************************************************************************/
				result = adminClient.invoke(handle, "testConnection", params, signature);
	} catch (MBeanException mbe) {
				// ****** all user exceptions come in here
		if (verbose) {
						Exception ex = mbe.getTargetException(); // this is the real exception from the Mbean
						System.out.println("¥nNLS:Mbean Exception was received contains " + ex);
			ex.printStackTrace();
			System.exit(1);
		}
	} catch (InstanceNotFoundException infe) {
				System.out.println("Cannot find " + infe);
	} catch (RuntimeMBeanException rme) {
				Exception ex = rme.getTargetException();
		ex.printStackTrace(System.out);
		throw ex;
	} catch (Exception ex) {
				System.out.println("¥nUnexpected Exception occurred: " + ex);
		ex.printStackTrace();
	}

         /*************************************************************************/
         /**  Process the result.  The result will be the number of warnings      */
         /**  issued.  A result of 0 indicates a successful connection with       */
         /**  no warnings. */
         /*************************************************************************/

		//A result of 0 indicates a successful connection with no warnings.
		System.out.println("Result= " + result);

  } catch (RuntimeOperationsException roe) {
		Exception ex = roe.getTargetException();
	ex.printStackTrace(System.out);
  } catch (Exception ex) {
		System.out.println("General exception occurred");
	ex.printStackTrace(System.out);
  }
 }
}
ヒント: テスト接続サービスは必ず既存のデータ・ソースと同じレベルで実行してください。例えば、データ・ソースがサーバー・レベルで構成されている場合は、テスト接続サービスをノード・レベルで実行しないでください。 テスト接続サービスとデータ・ソース構成が同じレベルに存在しない場合、ロード失敗例外が発生する可能性があります。 この場合、db2profile スクリプトをマシンに調達し、環境が DB2® ネイティブ・ライブラリーへのポインターを含むことを確認してください。db2profile スクリプトは、DB2 ユーザー ID のルート・ディレクトリーにあります。

トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=cdat_testcon
ファイル名:cdat_testcon.html