Oracle® Fusion Middleware Oracle WebLogic Server JDBC プログラマーズ ガイド 11g リリース 1 (10.3.1) B55535-01 |
|
戻る |
以下の節では、JDBC アプリケーションを開発する場合の一般的な問題について説明します。
使用するスレッディング モデルを確認してください。グリーン スレッドは、OCI で使用されるカーネル スレッドと衝突します。Oracle ドライバを使用する場合は、ネイティブ スレッドを使用することをお勧めします。ネイティブ スレッドの使用を指定するには、Java を起動するときに -native
フラグを追加します。
UNIX では、グリーン スレッドとネイティブ スレッドという 2 つのスレッディング モデルを利用できます。詳細については、http://www.java.sun.com
の Sun Web サイトで提供されている Solaris オペレーティング環境用の JDK を参照してください。
使用しているスレッドの種類は、THREADS_TYPE
環境変数を調べることで確認できます。この変数が設定されていない場合は、Java の bin ディレクトリにあるシェル スクリプトを調べてください。
一部の問題は、各オペレーティング システムの JVM でのスレッドの実装に関連しています。すべての JVM で、オペレーティング システム固有のスレッドの問題が等しく適切に処理されるわけではありません。以下に、スレッド関連の問題を防止するためのヒントを紹介します。
Oracle ドライバを使用する場合は、ネイティブ スレッドを使用する。
HP UNIX を使用する場合は、バージョン 11.x にアップグレードする。HP UX 10.20 などの旧バージョンでは JVM との互換性に問題があります。
HP UNIX の場合、新しい JDK ではグリーン スレッド ライブラリが SHLIB_PATH
に追加されない。現在の JDK では、SHLIB_PATH
で定義されたパスにある場合を除いて、共有ライブラリ (.sl
) を見つけられません。SHLIB_PATH
の現在の値を確認するには、コマンドラインで次のように入力します。
$ echo $SHLIB_PATH
set
コマンドまたは setenv
コマンドを使用すると (どちらを使用するかはシェルによる)、シンボル SHLIB_PATH
で定義されたパスに WebLogic の共有ライブラリを追加できます。SHLIB_PATH
で定義されていない場所にある共有ライブラリが認識されるようにするには、使用するシステムの管理者に連絡する必要があります。
プログラムが効率的に実行されるように、Connection
、Statement
、ResultSet
などの 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) {} }
以下の節では、Microsoft SQL Server データベースでネストされたトリガを使用する場合のトラブルシューティング情報を示します。
サポートされるデータベースとデータベース ドライバの情報については、「Oracle Fusion Middleware Supported System Configurations」(http://www.oracle.com/technology/software/products/ias/files/fusion_certification.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).
この問題を回避するには、次のようにします。
以下のスクリプトを実行して、ネストされたトリガのレベルを 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
以下のスクリプトを実行して、SQL Server の現在の値を確認します。
exec sp_configure 'nested triggers'
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