ナビゲーションをスキップ

WebLogic JDBC プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

JDBC 接続のテストとトラブルシューティング

以下で、JDBC 接続のテスト、モニタ、およびトラブルシューティングの方法について説明します。

 


JDBC 接続のモニタ

Administration Console では、各サブコンポーネント (接続プール、マルチプール、および DataSource) の接続パラメータをモニタするためのテーブルと統計を表示できます。

JDBCConnectionPoolRuntimeMBean を使用して、接続プールの統計にプログラムでアクセスすることもできます。関連する WebLogic Javadoc を参照してください。この MBean は、Administration Console に統計を取り込む API と同じものです。接続のモニタの詳細については、「JDBC 接続プール」を参照してください。

MBean の使い方については、『WebLogic JMX Service プログラマーズ ガイド』を参照してください。

 


コマンドラインからの DBMS 接続の有効性の検証

WebLogic Server のインストール後に 2 層 JDBC データベース接続をテストするには、utils.dbping BEA ユーティリティを使用します。utils.dbping ユーティリティを使用するには、JDBC ドライバのインストールを完了する必要があります。以下の作業を必ず行ってください。

utils.dbping ユーティリティを使用すると、Java とデータベースの間で接続が可能なことを確認できます。dbping ユーティリティは、WebLogic jDriver for Oracle などの WebLogic 2 層 JDBC ドライバを使用した 2 層接続のテストにのみ使用します。

構文

  $ java utils.dbping DBMS user password DB

引数

DBMS

ORACLE または MSSQLSERVER4 を使用します。

user

データベース ログインに使用する有効なユーザ名です。SQL Server では isql、Oracle では sqlplus で使用するものと同じ値と形式を使用します。

password

ユーザの有効なパスワード。isql、または sqlplus で使用するものと同じ値と形式を使用します。

DB

データベースの名前。形式は、データベースとバージョンに応じて異なります。isql、または sqlplus で使用するものと同じ値と形式を使用します。MSSQLServer4 などの Type 4 ドライバの場合は、環境にアクセスできないので、サーバを見つけるには補足情報が必要です。

Oracle

sqlplus で使用する同じ値を利用し、Java から WebLogic jDriver for Oracle 経由で Oracle に接続します。

SQLNet を使用しない (かつ ORACLE_HOME と ORACLE_SID が定義されている) 場合は、次の例に従います。

$ java utils.dbping ORACLE scott tiger

SQLNet V2 を使用する場合は、次の例に従います。

$ java utils.dbping ORACLE scott tiger TNS_alias

TNS_alias は、ローカルの tnsnames.ora ファイルで定義されているエリアスです。

Microsoft SQL Server (Type 4 ドライバ)

Java から WebLogic jDriver for Microsoft SQL Server 経由で Microsoft SQL Server に接続するには、userpasswordisql の場合と同じ値を使用します。ただし、SQL Server を指定するには、SQL Server が動作しているコンピュータの名前と SQL Server がリスンしている TCP/IP ポートを指定します。コンピュータ名が mars で、リスン ポートが 1433 の SQL Server にログインするには、次のように入力します。

$ java utils.dbping MSSQLSERVER4 sa secret mars:1433

1433 は Microsoft SQL Server のデフォルト ポート番号なので、この例の「:1433」は省略してもかまいません。デフォルトでは、Microsoft SQL Server は TCP/IP 接続をリスンしないことがあります。DBA でリスンするようにコンフィグレーションできます。

 


JDBC のトラブルシューティング

以降の節では、トラブルシューティングのヒントを紹介します。

JDBC 接続

WebLogic への接続をテストする場合は、WebLogic Server のログを調べてください。デフォルトでは、ログは次のフォーマットでファイルに記録されます。

domain\server\server.log

ここで domain はドメインのルート フォルダ、server はサーバの名前です。サーバ名は、フォルダ名やログ ファイル名で使用されます。

Windows

.dll のロードが失敗したことを示すエラー メッセージが表示された場合は、PATH で 32 ビット データベース関連の .dll を指定してください。

UNIX

.so または .sl のロードが失敗したことを示すエラー メッセージが表示された場合は、LD_LIBRARY_PATH または SHLIB_PATH で 32 ビット データベース関連のファイルを指定してください。

コードセットのサポート

WebLogic では、Oracle のコードセットがサポートされています。ただし、次のことに注意してください。

詳細については、「WebLogic jDriver for Oracle の使い方」の「コードセットのサポート」を参照してください。

UNIX での Oracle に関わる他の問題

使用するスレッディング モデルをチェックしてください。グリーン スレッドは、OCI で使用されるカーネル スレッドと衝突します。Oracle ドライバを使用する場合は、ネイティブ スレッドを使用することをお勧めします。ネイティブ スレッドの使用を指定するには、Java を起動するときに -native フラグを追加します。

UNIX でのスレッド関連の問題

UNIX では、グリーン スレッドとネイティブ スレッドという 2 つのスレッディング モデルを利用できます。詳細については、Sun の Web サイトで提供されている Solaris 環境用の JDK を参照してください。

使用しているスレッドの種類は、THREADS_TYPE 環境変数を調べることで確認できます。この変数が設定されていない場合は、Java の bin ディレクトリにあるシェル スクリプトを調べてください。

一部の問題は、各オペレーティング システムの JVM でのスレッドの実装に関連しています。すべての JVM で、オペレーティング システム固有のスレッドの問題が等しく適切に処理されるわけではありません。以下に、スレッド関連の問題を防止するためのヒントを紹介します。

JDBC オブジェクトのクローズ

プログラムが効率的に実行されるように、ConnectionStatementResultSet などの JDBC オブジェクトは必ず、finally ブロックで閉じるようにしてください。次に、一般的な例を示します。

try {
Driver d = 
(Driver)Class.forName("weblogic.jdbc.oci.Driver").newInstance();
Connection conn = d.connect("jdbc:weblogic:oracle:myserver",
"scott", "tiger");
    Statement stmt = conn.createStatement();
stmt.execute("select * from emp");
ResultSet rs = stmt.getResultSet();
// 処理を行う
    }
    catch (Exception e) {
      // 必要に応じて例外を処理する
    }
    finally {
      try {rs.close();}
catch (Exception rse) {}
try {stmt.close();}
catch (Exception sse) {}
try {conn.close();
catch (Exception cse) {}
    }

JDBC オブジェクトを破棄する

また、次のような処理も行わないでください。破棄された JDBC オブジェクトが作成されます。

//このようには行わない
stmt.executeQuery();
rs = stmt.getResultSet();
//代わりに次のように行う
rs = stmt.executeQuery();

上記の例の最初の行では、破棄されており、すぐにガベージ コレクションが行われる可能性のある結果セットが作成されます。

 


UNIX での共有ライブラリに関連する問題のトラブルシューティング

ネイティブの 2 層 JDBC ドライバをインストールするとき、パフォーマンス パックを使用するように WebLogic Server をコンフィグレーションするとき、または UNIX で BEA WebLogic Server を Web サーバとして設定するときには、システムで共有ライブラリまたは共有オブジェクト (WebLogic Server ソフトウェアと一緒に配布される) をインストールします。ここでは、予期される問題について説明し、それらの問題の解決策を提案します。

オペレーティング システムのローダでは、さまざまな場所でライブラリが検索されます。ローダの動作は、UNIX の種類によって異なります。以降の節では、Solaris と HP-UX について説明します。

WebLogic jDriver for Oracle

共有ライブラリは、このマニュアルで説明されている手順に従って設定してください。実際に指定するパスは、Oracle クライアントのバージョンや Oracle サーバのバージョンなどによって異なります。詳細については、「WebLogic jDriver for Oracle のコンフィグレーション」を参照してください。

Solaris

どのダイナミック ライブラリが実行ファイルによって使用されているのかを確認するには、ldd コマンドを実行します。このコマンドの出力が、ライブラリが見つからないことを示している場合は、次のようにして、ライブラリの位置を LD_LIBRARY_PATH 環境変数に追加します (C シェルまたは Bash シェルの場合)。

# setenv LD_LIBRARY_PATH weblogic_directory/lib/solaris/oci817_8

このようにして追加すれば、ldd を実行してもライブラリの紛失は報告されないはずです。

HP-UX

不適切なファイル パーミッションの設定

HP-UX システムで WebLogic Server をインストールした後、発生する可能性が最も高い共有ライブラリの問題は、不適切なファイル パーミッションの設定です。WebLogic Server をインストールした後は、chmod コマンドを使用して共有ライブラリのパーミッションを適切に設定してください。HP-UX 11.0 で適切なパーミッションを設定するには、次のように入力します。

% cd WL_HOME/lib/hpux11/oci817_8
% chmod 755 *.sl

ファイル パーミッションを設定した後に共有ライブラリをロードできない場合は、ライブラリの位置を特定することに問題があることが考えられます。その場合はまず、次のようにして、WL_HOME/server/lib/hpux11SHLIB_PATH 環境変数に設定されていることを確認してください。

% echo $SHLIB_PATH

そのディレクトリがない場合は、次のようにして追加してください。

# setenv SHLIB_PATH WL_HOME/server/lib/hpux11:$SHLIB_PATH

あるいは、WebLogic Server 配布キットにある .sl ファイルを SHLIB_PATH 変数ですでに設定されているディレクトリへコピー (またはリンク) してください。

それでも問題が解決しない場合は、chatr コマンドを使用して、アプリケーションが SHLIB_PATH 環境変数のディレクトリを検索するように指定してください。+s enabled オプションを使用すると、SHLIB_PATH 変数を検索するようにアプリケーションが設定されます。次に、このコマンドの例を示します。この例は、HP-UX 11.0 の WebLogic jDriver for Oracle 共有ライブラリで実行します。

# cd weblogic_directory/lib/hpux11
# chatr +s enable libweblogicoci38.sl

このコマンドの詳細については、chatr のマニュアル ページを参照してください。

不適切な SHLIB_PATH

Oracle 9 を使用している場合、SHLIB_PATH に適切なパスが含まれていないことが原因で共有ライブラリの問題が発生する場合もあります。SHLIB_PATH には、ドライバ (oci901_8) へのパスと、ベンダ提供のライブラリ (lib32) へのパスが含まれている必要があります。たとえば、パスは次のようになります。

export SHLIB_PATH=
$WL_HOME/server/lib/hpux11/oci901_8:$ORACLE_HOME/lib32:$SHLIB_PATH

パスに Oracle 8.1.7 ライブラリを含めることはできません。含まれているとクラッシュします。詳細については、「WebLogic jDriver for Oracle の使用環境の設定」を参照してください。

 


ネストされたトリガを使用した Microsoft SQL の使い方

この節では、一部の Microsoft SQL データベースにネストされたトリガを使用する場合のトラブルシューティング情報について説明します。

サポート対象のデータベースおよびデータベース ドライバの詳細については、サポート対象のコンフィグレーションを参照してください。

ネスト レベルの超過

一部の SQL Server データベースでネスト レベルが超過したことを示す SQL Server エラーが発生する場合があります。

次に例を示します。

CREATE TABLE EmployeeEJBTable (name varchar(50) not null,salary int, card  varchar(50), primary key (name))
CREATE TABLE CardEJBTable (cardno varchar(50) not null, employee varchar(50), primary key (cardno), foreign key (employee) references EmployeeEJB Table(name) on delete cascade)
CREATE TRIGGER  card on EmployeeEJBTable for delete as delete CardEJBTable  where employee in (select name from deleted)
CREATE TRIGGER  emp on CardEJBTable for delete as delete EmployeeEJBTable where card in (select cardno from deleted)
insert into EmployeeEJBTable values ('1',1000,'1')
insert into CardEJBTable values ('1','1')
DELETE FROM CardEJBTable WHERE cardno = 1

次のエラー メッセージが発生します。

Maximum stored procedure, function, trigger, or view nesting level exceeded  (limit 32).

この問題に対処するには、次の手順に従います。

  1. ネストされたトリガ レベルを 0 にリセットするには、次のスクリプトを実行してください。
  2. -- Start batch 
    exec sp_configure 'nested triggers', 0 -- This set's the new value.
    reconfigure with override -- This makes the change permanent
    -- End batch
  3. 次のスクリプトを実行して SQL server の現在の値を検証してください。
  4. exec sp_configure 'nested triggers' 

トリガおよび EJB の使い方

Microsoft ドライバで EJB を使用するアプリケーションでは、予想値が 1 (1 レコードを削除) の場合でも execute() メソッドからの戻りコードが 0 となる場合があります。

次に例を示します。

CREATE TABLE EmployeeEJBTable (name varchar(50) not null,salary int, card  varchar(50), primary key (name))
CREATE TABLE CardEJBTable (cardno varchar(50) not null, employee varchar(50), primary key (cardno), foreign key (employee) references EmployeeEJB Table(name) on delete cascade)
CREATE TRIGGER  emp on CardEJBTable for delete as delete EmployeeEJBTable where card in (select cardno from deleted)
insert into EmployeeEJBTable values ('1',1000,'1')
insert into CardEJBTable values ('1','1')
DELETE FROM CardEJBTable WHERE cardno = 1

EJB コードではレコードが見つからないと見なされ、適切なエラー メッセージを送出します。

この問題に対処するには、次のスクリプトを実行します。

exec sp_configure 'show advanced options', 1
reconfigure with override
exec sp_configure 'disallow results from triggers',1
reconfigure with override

 

フッタのナビゲーションのスキップ  ページの先頭 前 次