データ・アクセスの問題
WebSphere® Application Server 診断ツールは、データベース接続に関する問題のトラブルシューティングに役立つサービスを提供しています。 さらに、IBM® Web サイトには、データベース固有の接続の問題に対する文書化された解決策を見つけるための柔軟な検索機能が用意されています。
以下の手順は、接続に関する問題を迅速に切り分けるのに役立ちます。
- このアプリケーション・サーバーのログ・ファイルをブラウズして、手掛かりを探します。
トピック『エラー・ログのセットアップ』を参照してください。
トピック『JVM ログの表示』を参照してください。デフォルトでは、これらのファイルは app_server_root/server_name/SystemErr.log および SystemOut.log です。
注: このトピックでは、 1 つ以上のアプリケーション・サーバー・ログ・ファイルを参照します。推奨される代替案として、分散システムや IBM i システムの SystemOut.log、SystemErr.log、trace.log、activity.log ファイルではなく、High Performance Extensible Logging (HPEL) ログおよびトレース・インフラストラクチャーを使用するようにサーバーを構成できます。また HPEL は、ネイティブ z/OS ロギング機能と連携させて使用することができます。HPEL を使用する場合、LogViewer コマンド・ライン・ツールを サーバー・プロファイルの bin ディレクトリーから使用して、すべてのログ・ファイルにアクセスし、 情報をトレースできます。HPEL の使用について詳しくは、HPEL を使用してのアプリケーションの トラブルシューティングに関する情報を参照してください。 - データ・ソースの helper クラスのプロパティーをブラウズして、 それが正しいプロパティーで、WebSphere Application Server のクラスパス上にあることを確認します。 不可解なエラーまたは振る舞いが発生する場合は、helper クラス名の欠落や命名の誤りが原因である可能性があります。 WebSphere Application Server は、指定されたクラスをロードできない場合にはデフォルトの helper クラスを使用しますが、これはデータベース・マネージャーで正しく機能しない場合があります。
- データ・ソースの Java™ Naming and Directory Interface (JNDI) 名が、 そのデータ・ソースへのアクセスを試みているクライアントが使用する名前と一致することを検査します。 エラー・メッセージに、問題がネーミングに関連している可能性があると示される場合、つまり、メッセージ内で name server または naming service について言及されるか、あるいは NMSV で始まるエラー ID が含まれている場合は、『ネーミング関連の問題』および『ネーミング・サービス・コンポーネントのトラブルシューティング』トピックを参照してください。
- トレース指定 RRA=all=enabled を使用して、リソース・アダプター用のトレースを使用可能にします。 指示に従ってトレース出力をダンプしてブラウズし、問題の原因をしぼりこみます。 トピック『トレースの使用可能化』を参照してください。
データベース固有のトラブルシューティングに関するヒントの包括的なリストについては、WebSphere Application Server 製品サポート・ページを参照してください。(この項目の終わりにあるリンクをご覧ください。) 「Search Support」フィールドに、検索語の 1 つとしてデータベース・ベンダー名を入力します。 「Solve a problem」を選択して、次に「検索」をクリックします。
サポート参照は、常にこのインフォメーション・センターのトピック『IBM からのトラブルシューティングのヘルプ』で見つけることができます。
現在、このインフォメーション・センターでは、以下のデータベースに関するトラブルシューティングのヒントの提供は限定されています。
一般的なデータ・アクセス問題
- 例外 "IllegalConnectionUseException" が発生しました。
- WTRN0062E: 1 フェーズ可能なリソースを複数取得しようとする不正な試みが行われました。
- ConnectionWaitTimeoutException.
- com.ibm.websphere.ce.cm.StaleConnectionException: [IBM][CLI Driver] SQL1013N データベース別名またはデータベース名「NULL」が見つかりませんでした。 SQLSTATE=42705
- java.sql.SQLException: java.lang.UnsatisfiedLinkError:
- トランザクションを実行しようとしているときに、 「J2CA0030E: Method enlist caught java.lang.IllegalStateException」が、 「WTRN0063E: 既存の 2 フェーズ可能リソースがあり、1 フェーズ可能リソースを取得しようとする 不正な試みが行われました」というエラー内にラップされました。
- データベースを操作しようとしているときに 、java.lang.UnsatisfiedLinkError:xaConnect 例外が発生しました。
- データベース操作を行おうとすると、"J2CA0114W: No container-managed authentication alias found for connection factory or datasource datasource" というメッセージが表示されました。
- ws_ant コマンドを使用して、 HP プラットフォーム上で Structured Query Language in Java 用にデータベース・カスタマイズを実行すると、 エラーがスローされる。
- コンテナー管理パーシスタンス (CMP) で、定義されたとおりにデータベース・アクセス機能を正常に取得できない。
IllegalConnectionUseException
このエラーは 、WAS40DataSource から取得した接続が複数のスレッド上で使用されている場合に生じることがあります。 このような使用法は、J2EE 1.3 プログラミング・モデルに違反しているため、 サーバー上で検出されると例外が生成されます。この問題は、 サーブレットまたは Bean 管理パーシスタンス (BMP) タイプのエンタープライズ Beans を通じてデータ・ソースにアクセスするユーザーに関して生じます。
この問題を判別するには、接続共有のコードを調べます。 コードは、プログラミング・モデルの推奨に従わないことで、意図せずに共有を発生させる可能性があります。 例えば、サーブレットのインスタンス変数内に接続を保管することによって、 複数のスレッド上で同時に接続が使用される可能性があります。
WTRN0062E: 1 フェーズ可能なリソースを複数取得しようとする不正な試みが行われました。
- 1 フェーズ接続を共有しようとしたが、各 getConnection 呼び出しで使用されている接続プロパティー (AccessIntent プロパティーなど) が同じではなかった。
- データ・ソースが XA リソースでないときに、グローバル・トランザクションに複数の共有不可能な接続を参加させようとした。
- XA リソースまたは別の 1 フェーズ・リソースが既にグローバル・トランザクションで使用されているときに、このグローバル・トランザクションで 1 フェーズ・リソースを使用しようとした。エラー状態が発生した原因を特定する際に、以下の情報が役立つことがあります。
- 非 XA データ・ソースを使用しており、接続を共有しようとしている場合は、関連するすべての resource-ref を shareable に設定してください。 resource-ref を使用しない場合は、デフォルトで共有不可能な接続 (unshareable) に設定されます。
- 各接続要求で同じ接続プロパティー (IsolationLevel または AccessIntent など) を使用しない場合、接続は共有されません。
- 異なる AccessIntent 設定を使用している可能性がある CMP Bean を使用している場合、接続が共有されないことがあります。 非 CMP コンポーネントとの接続を共有する CMP Bean について詳しくは、『データ・アクセス API に対する拡張機能』を参照してください。
- getConnection 要求とともにクライアント・コードが渡すものを検査し、それらが相互に整合性があることを確認します。
- アセンブリー・ツールを使用して、リソース・バインディングから接続の共有有効範囲を検査します。トピック『アセンブリー・ツール』を参照してください。
- 共有不可能な接続有効範囲を実行している場合は、 データ・ソースが XA データ・ソースであることを確認します。
- 共有可能な接続有効範囲を実行している場合は、AccessIntent を含むすべての接続プロパティーが共有可能であることを確認します。
- 管理コンソールの「Manage JDBC resource」パネルで、JDBC プロバイダーの実装クラス が XA タイプのトランザクションをサポートするクラスであることを確認します。
データ・ソースまたはリソース・アダプターへのアクセス中の ConnectionWaitTimeoutException
- 特定のプールの接続の最大数が非常に低く設定されている。接続のコンカレント使用要求が、接続プール用に構成された最大値を超えています。 CPU 使用率が高くないにもかかわらずこれらの例外を定期的に受け取る場合は、これが問題の原因です。 この例外は、使用中のサーバーに、スレッドを保持するために使用できる接続がほとんどないことを示しています。
- 接続待ち時間が非常に低く設定されている。接続に対するCurrent®の要求が高すぎて、短時間有効な接続が存在しない 状態になることがあります。接続待ちタイムアウト値が非常に低い場合、 ユーザーが接続をプールに戻す直前にタイムアウトになることがあります。 これは、接続待ち時間を調整することである程度緩和できます。 延長期間中に最大に近い接続を使用しており、定期的にこのエラーを受け取る場合は、これが問題の原因です。
- いくつかの接続をクローズしていない、または接続をプールに返す速度が遅い。 この状況が発生するのは、共有不能な接続を使用している、接続をクローズし忘れた、または接続を使用し終えて長時間経過した後にクローズしたなどというときに、接続が再使用のためにプールに戻されなかった場合です。プールは空になり、すべてのアプリケーションが ConnectionWaitTimeoutExceptions を入手します。 この問題が発生すると、接続プール内の接続が使い尽くされ、 ほとんどの要求に対してエラーを受け取ることになります。
- サーバーまたはバックエンド・システムが処理するリソースを保持するよりも、多くのロードを駆動している。この場合、より必要なリソースを判別し、ニーズに対応するために構成またはハードウェアをアップグレードする必要があります。 この問題の 1 つの兆候として、アプリケーション・サーバーやデータベース・サーバーのプロセッサーがほぼ 100 % 使用中になります。
- 使用する接続数を少なくするようにアプリケーションを変更します。
- 接続を適宜クローズします。
- MaxConnections または ConnnectionWaitTimeout のプール設定を変更します。
- リソースとその構成を調整します。
com.ibm.websphere.ce.cm.StaleConnectionException: [IBM][CLI Driver] SQL1013N データベース別名またはデータベース名「NULL」が見つかりませんでした
com.ibm.websphere.ce.cm.StaleConnectionException: [IBM][CLI Driver] SQL1013N データベース別名またはデータベース名 "NULL" が見つかりませんでした。SQLSTATE=42705。このエラーは、データ・ソースが定義されているにもかかわらず、databaseName 属性とそれに対応する値が「カスタム・プロパティー」パネルに追加されていない場合に生じます。
- 管理コンソールで の順にリンクをクリックする。
- 問題のあるデータ・ソースをサポートする JDBC_provider を選択する。
- 「データ・ソース」を選択してから、問題のあるデータ・ソースを選択する。
- 「追加プロパティー」の下の「カスタム・プロパティー」をクリックする。
- 「databaseName」プロパティーを選択 (存在しない場合には追加) して、実際のデータベース名を値として入力する。
- 「適用」または「OK」をクリックし、アクション・バーの「保存」をクリックする。
- 再びデータ・ソースにアクセスする。
java.sql.SQLException: java.lang.UnsatisfiedLinkError
このエラーは、データベースをサポートするバイナリー・ライブラリーを含むディレクトリーが 、WebSphere Application Server が開始された環境の LIBPATH 環境変数に含まれていないことを示します。
DBM ベンダーのライブラリーを含むパスは、dbm によって変わります。それらを検索する方法の 1 つは、 エラー・メッセージに指定された欠落ライブラリーをスキャンすることです。次に、WebSphere Application Server が開始されたアカウントの .profile の中で、 またはこれから startServer プログラムを開始する .sh ファイルにステートメントを追加することによって、欠落しているディレクトリーを LIBPATH 変数に含めるように訂正できます。
Java の LIBPATH (java.library.path) プロパティーを domain_region_libpath 環境変数で、control_region_libpath、server_region_libpath、adjunct_region_libpath のように構成します。領域ライブラリー・パス変数の設定方法については、トピック『BBOM0001I メッセージで参照される変数の値の変更』を参照してください。
エラー J2CA0030E がエラー WTRN0063E でラップされた
トランザクションを実行しようとしているときに、"J2CA0030E: Method enlist caught java.lang.IllegalStateException"が、"WTRN0063E: 既存の 2 フェーズ可能リソースがあり、1 フェーズ可能リソースを取得しようとする不正な試みが行われました。"というエラーにラップされた。このエラーは、Last Participant Support が欠落しているか使用不可の場合に生じることがあります。 Last Participant Support は、1 フェーズ対応リソースと 2 フェーズ対応リソースを、同じトランザクション内で活用する機能をサポートします。
- WebSphere Application Server Programming Model Extensions (PME) がインストールされている。 PME は、Application Server Integration Server 製品に含まれています。
- PME のインストール時に、追加の Integration Server 拡張機能オプションが使用可能になっている。 この機能は、標準インストールを実行すると、デフォルトで使用可能になります。カスタム・インストールを実行する場合は、 この機能を使用不可にすることができます。この場合、Last Participant Support は使用不可になります。
- 1 フェーズ・リソースをリストしているアプリケーションが、 「Accept heuristic hazard」オプションを使用可能にしてデプロイされている。このデプロイメントは、アセンブリー・ツールを使用して実行されます。
データベースを操作しようとしているとき に、java.lang.UnsatisfiedLinkError:xaConnect 例外が発生しました。
- 最も一般的な原因は、データベースへの接続をサポートする JDBC ドライバーが欠落しているか、そのバージョンが正しくないことが挙げられます。
もう 1 つの一般的な原因は、ドライバーをサポートするネイティブ・ライブラリーがシステム・パスに存在していることが挙げられます。
- Windows プラットフォーム上でこの問題を解決するには、JDBC Driver の JAR ファイルが必ずシステム PATH 環境変数上に存在するようにします。
- DB2 を使用している場合は、
少なくとも DB2 クライアント製品を WebSphere ホスト上にインストールしておきます。
- DB2 バージョン 7.2 以前のバージョンでは、 クライアント製品が WebSphere Application Server 上にインストールされているファイルは db2java.zip です。データベースをインストールした後、 およびデータベース製品をアップグレードするたびに、usejdbc2.bat プログラムを 実行するようにします。
- DB2 バージョン 8.1 以降のバージョンでは、WebSphere Application Server に JDBC プロバイダーを定義するとき、DB2 Universal JDBC プロバイダー・ドライバーを使用してください。このドライバーのファイルは db2jcc.jar です。
タイプ 2 (デフォルト) オプションを使用する場合は、
少なくとも DB2 クライアント製品を WebSphere Application Server ホスト上にインストールしておきます。
タイプ 4 オプションを指定する場合は、DB2 クライアントをインストールする必要はありませんが、
ファイル db2jcc.jar はやはり必要です。
ドライバー・ファイルの場所を指定する場合、可能であれば、ローカル・ディレクトリーにファイルをコピーするのではなく、ターゲット DB2 インストール・システムのパスとファイル名を指定することを推奨します。そうしないと、ターゲット DB2 インストール・システムがアップグレードされ 、WebSphere Application Server が使用するドライバーがアップグレードされなかった場合に、問題が生じる危険があります。
- DB2 を使用している場合は、
少なくとも DB2 クライアント製品を WebSphere ホスト上にインストールしておきます。
- AIX® または Linux オペレーティング・システムの場合は、
ご使用のデータベース製品のデータベース・クライアントのサポートに必要なすべてのネイティブ・ライブラリーが、
WebSphere Application Server を開始するアカウントのプロファイルにある LD_LIBRARY_PATH 環境変数で指定されるようにします。
DB2 を使用している場合、ネイティブ・ライブラリーは libdb2jdbc.so です。 このライブラリーが WebSphere によって正しくアクセスされるようにする最善の方法は、WebSphere を実行しているアカウント (「root」など) の .profile スクリプトから、DB2 に付属している db2profile スクリプトを呼び出すことです。
- DB2 バージョン 7.2 以前のバージョンを使用している場合は、DB2 に付属している usejdbc2,script が、WebSphere Application Server を起動したアカウントのプロファイルから呼び出されるようにします。
- DB2 バージョン 8.1 以降のバージョンを使用している場合は、 前述の Windows オペレーティング・システムの説明を参照してください。
- Windows プラットフォーム上でこの問題を解決するには、JDBC Driver の JAR ファイルが必ずシステム PATH 環境変数上に存在するようにします。
- データベース・マネージャーが DB2 である場合、64 ビット・インスタンスを作成するオプションを選択できます。
64 ビット構成はサポートされない場合があります。
これが起きている場合には、そのデータベース・インスタンスを除去し、デフォルトの 32 ビット設定でインスタンスを作成します。
Universal JDBC T2 ドライバーを使用している場合、WebSphere Application Server は DB2 UDB 64 ビット・サーバーとの対話をサポートしますが、DB2 UDB 32 ビットを介して行う必要があります。WebSphere Application Server 環境 (CLASSPATH など) は、 正常に機能するために 32 ビット・クライアント・コードを使用する必要があります。
Universal JDBC T4 ドライバーでは、32 ビット DB2 クライアントを使用する必要はありません。 WebSphere Application Server 環境で、db2jcc.jar およびそのライセンス・ファイルを含むようにクラスパスを構成するだけです。
注: JDBC ドライバーとデータ・ソースを WebSphere Application Server で構成するときの一般的なヘルプについては、トピック『アプリケーションからのデータへのアクセス』を参照してください。
データベース操作を行おうとすると、"J2CA0114W: No container-managed authentication alias found for connection factory or data source datasource" というメッセージが表示される
このエラーは、JACL スクリプトを使用してデータ・ソースを作成した後で、アプリケーションを実行してその データ・ソースにアクセスする場合に、SystemOut.log ファイルで発生することがあります。
$AdminConfig create MappingModule $cmpConnectorFactory "{mappingConfigAlias
DefaultPrincipalMapping} {authDataAlias $authDataAlias}
この問題を解決するためには、欠落した行を JACL スクリプトに追加して、 もう一度スクリプトを実行します。サンプルの JACL スクリプトについては、トピック『Java Management Extensions API およびスクリプト・ツールを使用した JDBC プロバイダーおよびデータ・ソースの作成』を参照してください。
ws_ant コマンドを使用して HP プラットフォームで SQLJ 用にデータベース・カスタマイズを実行すると、エラーが発生する
[java] [ibm][db2][jcc][sqlj]
[java] [ibm][db2][jcc][sqlj] Begin customization
[java] [ibm][db2][jcc][sqlj] encoding not supported!!
このエラーは、
HP のデフォルト文字セットを使用してデータベースを作成したことが原因で発生した可能性があります。 Java Common Client (JCC) ドライバーは、Software Development Kit (SDK) を使用して、コード・ページの変換を実行します。しかし本製品に付属の SDK は HP のデフォルトのコード・ページに対応していません。export LANG=en_US.iso88591
情報管理ソフトウェアの IBM サポート・サイトを参照して、DB2 の最新技術情報にアクセスしてください。コンテナー管理パーシスタンス (CMP) で、定義されたとおりにデータベース・アクセス機能を正常に取得できない
WebSphere Application Server が、接続ファクトリー上のデータベースでアクセスされる特定の生成済みコードをキャッシングしていて、Java アーカイブ (JAR) ファイルにおける変更によりデータベース・アクセスの再生成が必要になった場合、これらの変更はサーバーを停止して再始動するまで有効になりません。
- エンタープライズ Bean カスタム finder メソッドを追加した場合。NullPointerException 例外が作成されます。
- エンタープライズ Bean カスタム finder メソッドを更新した場合。新しい SQL ステートメントが実行されません。
- スキーマ・マッピングを変更した場合。新しい SQL ステートメントが実行されません。
要約すると、カスタム finder メソッドを含むエンタープライズ Bean を追加または更新した場合は、サーバーを停止して再始動する必要があります。