ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JDBCのプログラミング
11g リリース1 (10.3.6)
B60995-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
 

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

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

UNIXでのOracle Database関連の問題

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

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

UNIXでは、グリーン・スレッドとネイティブ・スレッドという2つのスレッディング・モデルを利用できます。詳細は、Solarisオペレーティング環境のJDK (http://www.oracle.com/technetwork/java/index.html)を参照してください。

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

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

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

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

例9-1 JDBCオブジェクトのクローズ

try {

Driver d = 
(Driver)Class.forName("oracle.jdbc.OracleDriver").newInstance();

Connection conn = d.connect("jdbc:weblogic:oracle:myserver",
                                  "scott", "tiger");

    Statement stmt = conn.createStatement();
    stmt.execute("select * from emp");
    ResultSet rs = stmt.getResultSet();
    // do work

    }

    catch (Exception e) {

      // handle any exceptions as appropriate

    }

    finally {

      try {rs.close();}
      catch (Exception rse) {}
      try {stmt.close();}
      catch (Exception sse) {}
      try {conn.close();
      catch (Exception cse) {}

    }

JDBCオブジェクトの破棄

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

//Do not do this.
stmt.executeQuery();
rs = stmt.getResultSet();

//Do this instead
rs = stmt.executeQuery();

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

Microsoft SQL Serverでのネストされたトリガーの使用

以下の節では、Microsoft SQL Serverデータベースでネストされたトリガーを使用する場合のトラブルシューティング情報を示します。

サポートされるデータベースとデータベース・ドライバの詳細は、「Oracle Fusion Middlewareサポートされるシステム構成」ページ(http://www.oracle.com/technetwork/middleware/ias/downloads/fusion-certification-100350.htmlを参照してください。

ネスト・レベルの超過

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にリセットします。

    -- Start batch 
    exec sp_configure 'nested triggers', 0  -- This set's the new value. 
    reconfigure with override -- This makes the change permanent 
    -- End batch 
    
  2. 以下のスクリプトを実行して、SQL Serverの現在の値を確認します。

    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
The EJB code assumes that the record is not found and throws an appropriate error 
message. 
To work around this issue, run the following script:
   exec sp_configure 'show advanced options', 1
   reconfigure with override
   exec sp_configure 'disallow results from triggers',1
   reconfigure with override