WebLogic JDBC プログラマーズ ガイド
![]() |
![]() |
![]() |
![]() |
以下で、JDBC 接続のテスト、モニタ、およびトラブルシューティングの方法について説明します。
Administration Console では、各サブコンポーネント (接続プール、マルチプール、および DataSource) の接続パラメータをモニタするためのテーブルと統計を表示できます。
JDBCConnectionPoolRuntimeMBean
を使用して、接続プールの統計にプログラムでアクセスすることもできます。関連する WebLogic Javadoc を参照してください。この MBean は、Administration Console に統計を取り込む API と同じものです。接続のモニタの詳細については、「JDBC 接続プール」を参照してください。
MBean の使い方については、『WebLogic JMX Service プログラマーズ ガイド』を参照してください。
WebLogic Server のインストール後に 2 層 JDBC データベース接続をテストするには、utils.dbping
BEA ユーティリティを使用します。utils.dbping
ユーティリティを使用するには、JDBC ドライバのインストールを完了する必要があります。以下の作業を必ず行ってください。
PATH
(Windows) あるいは共有ライブラリ パスまたはロード ライブラリ パス (Unix) で DBMS 提供のクライアントと BEA 提供のネイティブ ライブラリの両方を設定します。 CLASSPATH
で JDBC ドライバのクラスを設定します。 utils.dbping ユーティリティを使用すると、Java とデータベースの間で接続が可能なことを確認できます。dbping ユーティリティは、WebLogic jDriver for Oracle などの WebLogic 2 層 JDBC ドライバを使用した 2 層接続のテストにのみ使用します。
$ java utils.dbping DBMS user password DB
ORACLE
または MSSQLSERVER4
を使用します。
データベース ログインに使用する有効なユーザ名です。SQL Server では isql
、Oracle では sqlplus
で使用するものと同じ値と形式を使用します。
ユーザの有効なパスワード。isql
、または sqlplus
で使用するものと同じ値と形式を使用します。
データベースの名前。形式は、データベースとバージョンに応じて異なります。isql
、または sqlplus
で使用するものと同じ値と形式を使用します。MSSQLServer4 などの Type 4 ドライバの場合は、環境にアクセスできないので、サーバを見つけるには補足情報が必要です。
sqlplus で使用する同じ値を利用し、Java から WebLogic jDriver for Oracle 経由で Oracle に接続します。
SQLNet を使用しない (かつ ORACLE_HOME と ORACLE_SID
が定義されている) 場合は、次の例に従います。
$ java utils.dbping ORACLE scott tiger
$ java utils.dbping ORACLE scott tiger TNS_alias
TNS_alias
は、ローカルの tnsnames.ora
ファイルで定義されているエリアスです。
Java から WebLogic jDriver for Microsoft SQL Server 経由で Microsoft SQL Server に接続するには、user
と password
で isql
の場合と同じ値を使用します。ただし、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 でリスンするようにコンフィグレーションできます。
WebLogic への接続をテストする場合は、WebLogic Server のログを調べてください。デフォルトでは、ログは次のフォーマットでファイルに記録されます。
domain
\server
\server
.log
ここで domain
はドメインのルート フォルダ、server
はサーバの名前です。サーバ名は、フォルダ名やログ ファイル名で使用されます。
.dll
のロードが失敗したことを示すエラー メッセージが表示された場合は、PATH
で 32 ビット データベース関連の .dll
を指定してください。
.so
または .sl
のロードが失敗したことを示すエラー メッセージが表示された場合は、LD_LIBRARY_PATH
または SHLIB_PATH
で 32 ビット データベース関連のファイルを指定してください。
WebLogic では、Oracle のコードセットがサポートされています。ただし、次のことに注意してください。
詳細については、「WebLogic jDriver for Oracle の使い方」の「コードセットのサポート」を参照してください。
使用するスレッディング モデルをチェックしてください。グリーン スレッドは、OCI で使用されるカーネル スレッドと衝突します。Oracle ドライバを使用する場合は、ネイティブ スレッドを使用することをお勧めします。ネイティブ スレッドの使用を指定するには、Java を起動するときに -native
フラグを追加します。
UNIX では、グリーン スレッドとネイティブ スレッドという 2 つのスレッディング モデルを利用できます。詳細については、Sun の Web サイトで提供されている Solaris 環境用の JDK を参照してください。
使用しているスレッドの種類は、THREADS_TYPE
環境変数を調べることで確認できます。この変数が設定されていない場合は、Java の bin ディレクトリにあるシェル スクリプトを調べてください。
一部の問題は、各オペレーティング システムの JVM でのスレッドの実装に関連しています。すべての JVM で、オペレーティング システム固有のスレッドの問題が等しく適切に処理されるわけではありません。以下に、スレッド関連の問題を防止するためのヒントを紹介します。
SHLIB_PATH
に追加されません。現在の JDK では、SHLIB_PATH
で定義されたパスにない限り、共有ライブラリ (.sl
) を見つけることができません。SHLIB_PATH
の現在の値を確認するには、コマンドラインで次のように入力します。
$ echo $SHLIB_PATH
プログラムが効率的に実行されるように、Connection
、Statement
、ResultSet
などの 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 オブジェクトが作成されます。
//このようには行わない
stmt.executeQuery();
rs = stmt.getResultSet();
//代わりに次のように行う
rs = stmt.executeQuery();
上記の例の最初の行では、破棄されており、すぐにガベージ コレクションが行われる可能性のある結果セットが作成されます。
ネイティブの 2 層 JDBC ドライバをインストールするとき、パフォーマンス パックを使用するように WebLogic Server をコンフィグレーションするとき、または UNIX で BEA WebLogic Server を Web サーバとして設定するときには、システムで共有ライブラリまたは共有オブジェクト (WebLogic Server ソフトウェアと一緒に配布される) をインストールします。ここでは、予期される問題について説明し、それらの問題の解決策を提案します。
オペレーティング システムのローダでは、さまざまな場所でライブラリが検索されます。ローダの動作は、UNIX の種類によって異なります。以降の節では、Solaris と HP-UX について説明します。
共有ライブラリは、このマニュアルで説明されている手順に従って設定してください。実際に指定するパスは、Oracle クライアントのバージョンや Oracle サーバのバージョンなどによって異なります。詳細については、「WebLogic jDriver for Oracle のコンフィグレーション」を参照してください。
どのダイナミック ライブラリが実行ファイルによって使用されているのかを確認するには、ldd
コマンドを実行します。このコマンドの出力が、ライブラリが見つからないことを示している場合は、次のようにして、ライブラリの位置を LD_LIBRARY_PATH
環境変数に追加します (C シェルまたは Bash シェルの場合)。
# setenv LD_LIBRARY_PATH weblogic_directory/lib/solaris/oci817_8
このようにして追加すれば、ldd
を実行してもライブラリの紛失は報告されないはずです。
HP-UX システムで WebLogic Server をインストールした後、発生する可能性が最も高い共有ライブラリの問題は、不適切なファイル パーミッションの設定です。WebLogic Server をインストールした後は、chmod
コマンドを使用して共有ライブラリのパーミッションを適切に設定してください。HP-UX 11.0 で適切なパーミッションを設定するには、次のように入力します。
% cdWL_HOME
/lib/hpux11/oci817_8
% chmod 755 *.sl
ファイル パーミッションを設定した後に共有ライブラリをロードできない場合は、ライブラリの位置を特定することに問題があることが考えられます。その場合はまず、次のようにして、WL_HOME
/server/lib/hpux11
が SHLIB_PATH
環境変数に設定されていることを確認してください。
% echo $SHLIB_PATH
そのディレクトリがない場合は、次のようにして追加してください。
# setenv SHLIB_PATHWL_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
のマニュアル ページを参照してください。
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 データベースにネストされたトリガを使用する場合のトラブルシューティング情報について説明します。
サポート対象のデータベースおよびデータベース ドライバの詳細については、サポート対象のコンフィグレーションを参照してください。
一部の 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).
-- Start batch
exec sp_configure 'nested triggers', 0 -- This set's the new value.
reconfigure with override -- This makes the change permanent
-- End batch
exec sp_configure 'nested triggers'
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
![]() ![]() |
![]() |
![]() |