Oracle® Fusion Middleware Oracle WebLogic Server JDBCのプログラミング 11gリリース1 (10.3.6) B60995-04 |
|
![]() 前 |
この章では、JDBCアプリケーションの開発時によくある問題について説明します。
使用するスレッディング・モデルを確認してください。Oracleドライバを使用する場合は、ネイティブ・スレッドを使用することをお薦めします。ネイティブ・スレッドの使用を指定するには、Javaを起動するときに-native
フラグを追加します。
UNIXでは、グリーン・スレッドとネイティブ・スレッドという2つのスレッディング・モデルを利用できます。詳細は、http://www.oracle.com/technetwork/java/index.html
で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
ブロックでクローズすることをお薦めします。次に、一般的な例を示します。
例 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) {} }
以下の節では、Microsoft SQL Serverデータベースでネストされたトリガーを使用する場合のトラブルシューティング情報を示します。
サポートされるデータベースとデータベース・ドライバの情報については、「Oracle Fusion Middleware Supported System Configurations」ページ(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).
この問題を回避するには、次のようにします。
以下のスクリプトを実行して、ネストされたトリガーのレベルを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 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