|
|
| |
JDBC 接続のテストとトラブルシューティング
以下の節では、JDBC 接続のテスト方法を説明するとともに、トラブルシューティングのヒントを紹介します。
以降の節では、接続をテストする方法について説明します。
BEA では、WebLogic 2 層ドライバ、WebLogic Server、または WebLogic JDBC をインストールした後、2 層および 3 層の JDBC データベース接続をテストするために使用できるユーティリティを用意しています。
utils.dbping
ユーティリティを使用するには、JDBC ドライバのインストールを完了する必要があります。以下の作業を必ず行ってください。
PATH
(Windows NT)あるいは共有ライブラリ パスまたはロード ライブラリ パス(Unix)で DBMS 提供のクライアントと BEA 提供のネイティブ ライブラリの両方を設定します。
CLASSPATH
で JDBC ドライバのクラスを設定します。
utils.dbping
ユーティリティを使用すると、Java とデータベースの間で接続が可能なことを確認できます。dbping ユーティリティは、WebLogic jDriver for Oracle などの WebLogic 2 層 JDBC ドライバを使用した 2 層接続 のテストにのみ使用します。
構文
$ java utils.dbping DBMS user password DB
引数
DBMS
ORACLE、MSSQLSERVER4、または INFORMIX4
を使用します。
user
データベース ログインに使用する有効なユーザ名です。SQL Server では isql
、Oracle では sqlplus
、Informix では DBACCESS
で使用するものと同じ値と形式を使用します。
password
ユーザの有効なパスワード。isql
、sqlplus
、または DBACCESS
で使用するものと同じ値と形式を使用します。
DB
データベースの名前。形式は、データベースとバージョンに応じて異なります。isql
、sqlplus
、または DBACCESS
で使用するものと同じ値と形式を使用します。MSSQLServer4 や Informix4 などの 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 に接続するには、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 でリスンするようにコンフィグレーションできます。
Informix(Type 4 ドライバ)
DBACCESS
で使用する同じ値を利用し、Java から WebLogic jDriver for Informix 経由で Informix に接続します。引数は、次の順序で指定します。
$ java utils.dbping INFORMIX user pass db@server:port
この例では、次のように指定します。
$ java utils.dbping INFORMIX bill secret stores@myserver:8543
コマンドラインからの多層 WebLogic JDBC 接続の有効性を検証する方法
utils.t3dbping
ユーティリティを使用すると、WebLogic Server を使用した多層データベース接続が可能なことを確認できます。t3dbping
ユーティリティは、多層接続のテストのみに使用します。このテストは、2 層接続が正常に機能することを確認し、WebLogic を起動した後に行います。
2 層 JDBC ドライバが WebLogic jDriver の場合は、utils.dbping
を使用して 2 層接続をテストします。他のドライバの場合は、多層接続をテストする前に、使用する 2 層 JDBC ドライバのドキュメントを参照して接続のテスト方法を確認してください。
構文
$ java utils.t3dbping
URL user password DB driver_class driver_URL
引数
URL
WebLogic Server の URL。
username
DBMS の有効なユーザ名です。
password
ユーザの有効なパスワードです。
DB
データベースの名前。前述の 2 層接続のテストで使用した同じ値と形式を使用します。
driver_class
WebLogic と DBMS を接続する JDBC ドライバのクラス名です。たとえば、サーバサイドで WebLogic jDriver for Oracle を使用する場合、ドライバのクラス名は weblogic.jdbc.oci.Driver
です。ドライバのクラス名では、ドット(.)表記を使用します。
driver_URL
WebLogic と DBMS を接続する JDBC ドライバの URL です。たとえば、サーバサイドで WebLogic jDriver for Oracle を使用する場合、ドライバの URL は jdbc:weblogic:oracle
です。ドライバの URL はコロンで区切ります。
例
以下の例は、読みやすいように複数の行に分けられています。実際には、1 つのコマンドとして入力してください。
Oracle
次の例は、bigbox というサーバで動作している Oracle DBMS DEMO20 に対して ping を実行する方法を示しています。WebLogic も同じホストにあり、ポート 7001 でリスンしています。
$ java utils.t3dbping // コマンド
t3://bigbox:7001 // WebLogic URL
scott tiger // ユーザ名とパスワード
DEMO20 //
DB
weblogic.jdbc.oci.Driver // ドライバのクラス
jdbc:weblogic:oracle // ドライバの URL
DB2 と AS/400 Type 4 JDBC ドライバ
次の例は、IBM AS/400 Type 4 JDBC ドライバを使用してワークステーションのコマンド シェルから AS/400 DB2 データベースに対して ping を実行する方法を示しています。
$ java utils.t3dbping // コマンド
t3://as400box:7001 // WebLogic URL
scott tiger // ユーザ名とパスワード
DEMO // データベース
com.ibm.as400.access.AS400JDBCDriver // ドライバのクラス
jdbc:as400://as400box // ドライバの URL
WebLogic jDriver for Microsoft SQL Server(Type 4 JDBC ドライバ)
次の例は、WebLogic jDriver for Microsoft SQL Server を使用して Microsoft SQL Server データベースに対して ping を実行する方法を示しています。
$ java utils.t3dbping // コマンド
t3://localhost:7001 // WebLogic URL
sa // ユーザ名
abcd // パスワード
hostname // database@hostname:port
//
(URL
の一部として指定する場合は
//
省略可能)
weblogic.jdbc.mssqlserver4.Driver // ドライバのクラス
jdbc:weblogic:mssqlserver4:pubs@localhost:1433
// ドライバの URL:database@hostname:port
//(データベース パラメータで使用されている場合は省略可)
以降の節では、トラブルシューティングのヒントを紹介します。
WebLogic への接続をテストする場合は、WebLogic のログを調べてください。デフォルトでは、ログは weblogic
\myserver
ディレクトリの weblogic.log
というファイルに記録されています。
UNIX ユーザ
native_login のロードで問題が発生した場合は、truss
を使用して問題の原因を突き止めます。たとえば、tutorial.example3 を実行するには、次のように入力します。
$ truss -f -t open -s\!all java tutorial.example3
WinNT
.dll
のロードが失敗したことを示すエラー メッセージが表示された場合は、PATH で 32 ビット データベース関連の .dll
を指定してください。
条件次第では、JDBC と Oracle データベースを使用するときにセグメンテーション違反エラー(SEGV)やハングが発生します。以下の事項に注意してください。
close()
メソッドが呼び出されるようにします。もっと多くの接続が必要な場合は、プールのサイズを大きくします。
sqlnet.ora
ファイルで "automatic_ipc"=off
を指定します。
ORACLE_HOME
環境変数が正確に設定されていません。ORACLE_HOME
は、OCI ライブラリが必要なリソース ファイルを見つけられるように正確に設定する必要があります。
メモリ不足エラーのよくある原因は、ResultSet が閉じていないことです。たいていは、以下のようなエラー メッセージが表示されます。
Run-time exception error; current exception: xalloc
No handler for exception
配列フェッチを使用すると、ネイティブ レイヤではメモリが Java ではなく C に割り当てられます。そのため、Java のガベージ コレクションではメモリがすぐにはクリーンアップされません。メモリを解放する唯一の方法は、ResultSet を閉じることです(このメモリ使用量を最小限に抑えれば、パフォーマンスが向上します)。
メモリ不足エラーを防止するには、プログラム ロジックで必ず ResultSet を閉じるようにします。閉じていない ResultSet が原因でメモリ不足エラーが発生しているのかをテストするには、配列フェッチのサイズを最小限にして、割り当てられる C メモリの量を少なくします。そのためには、weblogic.oci.cacheRows
プロパティ(JDBC 接続プロパティ)を小さい値に設定します。次に例を示します。
Properties props = new java.util.Properties();
props.put("user", "scott");
props.put("password", "tiger");
props.put("server", "DEMO" );
props.put("weblogic.oci.cacheRows", "1" );
Driver d =
(Driver)Class.forName("weblogic.jdbc.oci.Driver").newInstance();
Connection conn = d.connect("jdbc:weblogic:oracle", props);
これでメモリ不足エラーが解消されたら、ResultSet
がコードのどこかで閉じられていないと判断できます。詳細については、「JDBC オブジェクトを閉じる」を参照してください。
コードセットのサポート
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
set
コマンドまたは setenv
コマンド(どちらを使用するかはシェルによる)を使用すると、シンボル SHLIB_PATH
で定義されたパスに WebLogic の共有ライブラリを追加できます。SHLIB_PATH
で定義されていない場所にある共有ライブラリを認識させるには、システム管理者に連絡する必要があります。
プログラムを効率的に実行するために、finally ブロックで Connection、Statement、ResultSet などの JDBC オブジェクトを必ず閉じるようにしてください。これは WebLogic の推奨であるとともに、プログラミングの優れた慣例でもあります。次に、一般的な例を示します。
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) {}
}
UNIX での共有ライブラリに関連する問題のトラブルシューティング
ネイティブの 2 層 JDBC ドライバをインストールするとき、パフォーマンス パックを使用するように WebLogic Server をコンフィグレーションするとき、または UNIX で BEA WebLogic Server を Web サーバとして設定するときには、システムで共有ライブラリまたは共有オブジェクト(WebLogic ソフトウェアと一緒に配布される)をインストールします。ここでは、予期される問題について説明し、それらの問題の解決策を提案します。
オペレーティング システムのローダでは、さまざまな場所でライブラリが検索されます。ローダの動作は、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
このようにして追加すれば、ld
を実行してもライブラリの紛失は報告されないはずです。
不適切なファイル パーミッションの設定
HP-UX システムで WebLogic をインストールした後、発生する可能性が最も高い共有ライブラリの問題は、不適切なファイル パーミッションの設定です。WebLogic をインストールした後は、chmod
コマンドを使用して共有ライブラリのパーミッションを適切に設定してください。HP-UX 11.0 で適切なパーミッションを設定するには、次のように入力します。
% cd weblogic_directory/lib/hpux11/oci817_8
% chmod 755 *.sl
ファイル パーミッションを設定した後に共有ライブラリをロードできない場合は、ライブラリの位置を特定することに問題があることが考えられます。その場合はまず、次のようにして、weblogic_directory/lib/hpux11
が SHLIB_PATH
環境変数に設定されていることを確認してください。
% echo $SHLIB_PATH
そのディレクトリがない場合は、次のようにして追加してください。
# setenv SHLIB_PATH weblogic_directory/lib/hpux11:$SHLIB_PATH
あるいは、WebLogic 配布キットにある .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 libweblogicoci37.sl
このコマンドの詳細については、chatr
のマニュアル ページを参照してください。
不適切な SHLIB_PATH
Oracle 9 を使用している場合、SHLIB_PATH
に適切なパスが含まれていないことが原因で共有ライブラリの問題が発生する場合もあります。SHLIB_PATH には、ドライバ(oci901_8
)へのパスと、ベンダ提供のライブラリ(lib32
)へのパスが含まれている必要があります。たとえば、パスは次のようになります。
export SHLIB_PATH=
$WL_HOME/lib/hpux11/oci901_8:ORACLE/lib32:$SHLIB_PATH
パスに Oracle 8.1.7 ライブラリを含めることはできません。含まれているとクラッシュします。詳細については、「WebLogic jDriver for Oracle の使用環境の設定」を参照してください。