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

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

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

以下の節では、JDBC アプリケーションを開発する場合の一般的な問題について説明します。

 


UNIX での Oracle 関連の問題

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

 


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

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

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

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

 


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

プログラムが効率的に実行されるように、ConnectionStatementResultSet などの JDBC オブジェクトは必ず finally ブロックでクローズすることをお勧めします。次に、一般的な例を示します。

コード リスト 7-1 JDBC オブジェクトのクローズ
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();

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

 


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 の使用

EJB と Microsoft ドライバを使用するアプリケーションで、execute() メソッドからの戻りコードが 0、予期していた値が 1 (1 レコード削除) という状況が発生する場合があります。

次に例を示します。

   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

ページの先頭       前  次