次の項目が含まれます。
サーバー側内部ドライバは、Oracle DatabaseとJava Virtual Machine(JVM)に結び付けられています。このドライバは、データベースと同じプロセスの一部として動作します。また、デフォルトのセッション(JVMが起動されたセッションと同じセッション)内で動作します。
サーバー側内部ドライバはデータベース・サーバー内で動作するよう最適化されており、このドライバを使用するとローカル・データベース上のSQLデータおよびPL/SQLサブプログラムに直接アクセスできます。JVM全体は、データベースおよびSQLエンジンと同じアドレス空間内で動作します。SQLエンジンへのアクセスはファンクション・コールです。これによって、Java Database Connectivity(JDBC)アプリケーションのパフォーマンスが向上し、SQLエンジンへのアクセスにリモートOracle Netコールを実行するよりも高速になります。
サーバー側内部ドライバは、クライアント側ドライバと同じ機能、Application Program Interface(API)およびOracle拡張機能をサポートします。これにより、アプリケーションのパーティション化が非常に簡単になります。たとえば、データ集中処理型のJavaアプリケーションがある場合は、アプリケーション固有のコールを修正しなくても、パフォーマンスを向上させるために簡単にデータベース・サーバーに移動できます。
前の項で説明したように、サーバー側内部ドライバはデフォルトのセッション内で動作します。したがって、すでに接続された状態になっています。デフォルト接続にアクセスするには、次の2つのメソッドを使用できます。
次のいずれかの形式をURL文字列として、OracleDataSource.getConnectionメソッドを使用します。
jdbc:oracle:kprb
jdbc:default:connection
jdbc:oracle:kprb:
jdbc:default:connection:
OracleDriverクラスのOracle固有defaultConnectionメソッドを使用します。
通常はdefaultConnectionの使用をお薦めします。
|
注意: サーバー側内部ドライバと接続するためにOracleDriverクラスを登録する必要はなくなりました。 |
OracleDriverクラスのdefaultConnectionメソッドによる接続
oracle.jdbc.OracleDriverクラスのdefaultConnectionメソッドは、Oracle拡張機能で、常に同じ接続オブジェクトを戻します。発生した接続オブジェクトを別の変数名に割り当て、このメソッドを複数回コールしたとしても、1つの接続オブジェクトのみが再利用されます。
defaultConnectionコールに接続文字列を指定する必要はありません。たとえば、次のようになります。
import java.sql.*;
import oracle.jdbc.*;
class JDBCConnection
{
public static Connection connect() throws SQLException
{
Connection conn = null;
try {
// connect with the server-side internal driver
conn = ora.defaultConnection();
}
} catch (SQLException e) {...}
return conn;
}
}
この例にはconn.closeコールがないことに注意してください。JDBCコードがターゲット・サーバー内で実行されている場合、接続は暗黙的なデータ・チャネルで、クライアントからの場合のように明示的な接続インスタンスではありません。これはクローズしないでください。
closeメソッドをコールする場合は、次の点に注意してください。
実際に、同じデータベース接続を参照するdefaultConnectionメソッドによって取得されたすべての接続インスタンスは、必要に応じて、状態とリソースのクリーン・アップによってクローズされ、それ以降使用できなくなります。後でdefaultConnectionを実行すると、新しい接続オブジェクトが生成されます。
接続オブジェクトをクローズしても、データベースへの暗黙的な接続はクローズされません。
OracleDataSource.getConnectionメソッドによる接続
ターゲット・サーバー内で実行中のコードから内部サーバー接続に接続するには、次のいずれかのURLとともに、OracleDataSource.getConnectionメソッドを使用できます。
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:kprb");
Connection conn = ods.getConnection();
または
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:default:connection");
Connection conn = ods.getConnection();
または
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:oracle:kprb:");
Connection conn = ods.getConnection();
または
OracleDataSource ods = new OracleDataSource();
ods.setURL("jdbc:default:connection:");
Connection conn = ods.getConnection();
URL内で指定したユーザー名またはパスワードは、デフォルトのサーバー接続への接続では無視されます。
OracleDataSource.getConnectionメソッドをコールする度に、このメソッドは新しいJava Connectionオブジェクトを戻します。オブジェクト・マップまたは型マップを操作している場合は、OracleDataSource.getConnectionをコールする都度、このメソッドが新しい接続オブジェクトを戻すということに重要な意味があります。型マップは、特定のConnectionオブジェクトおよびそのオブジェクトの一部である状態に関連付けられます。プログラムの一部として複数の型マップを使用する場合は、getConnectionをコールして、各型マップに対して新しいConnectionオブジェクトを作成できます。
|
注意: OracleDataSource.getConnectionメソッドはコールするたびに新規オブジェクトを戻しますが、毎回、新しいデータベース接続を作成するわけではありません。 |
サーバー側内部ドライバは、getMessage()、getErrorCode()、getSQLState()などの標準例外処理機能に加えて、最も古いサーバー側内部ドライバからの遺物であるoracle.jdbc.driver.OracleSQLExceptionクラスもサポートしています。このクラスは、標準java.sql.SQLExceptionクラスのサブクラスで、クライアント側JDBCドライバまたはサーバー側Thinドライバからは使用できません。
サーバーでエラー状態が発生した場合は、内部エラー・スタックに一連の関連するエラーが格納されることがあります。JDBCサーバー側内部ドライバは、スタックからエラーを取り出して、OracleSQLExceptionオブジェクトの連鎖に格納します。
例外を処理するために次のメソッドを使用できます。
SQLException getNextException()
このメソッドは、連鎖内の次の例外(次の例外がない場合は、NULL値)を戻します。受け取った最初の例外から初めて、連鎖全体を処理できます。これは標準メソッドです。
int getNumParameters()(Oracle拡張機能)
サーバーからのエラーには、通常エラー・メッセージの一部であるパラメータまたは変数が含まれます。これらは発生したエラーの種類、試行されていた操作の種類、無効な値または影響を受けた値を示すことがあります。このメソッドは、このエラーに含まれるいくつかのパラメータを戻します。これはOracle拡張機能です。
Object[] getParameters()(Oracle拡張機能)
このメソッドは、このエラーに含まれるパラメータを格納したJava Object[]配列を戻します。これはOracle拡張機能です。
ただし、11gリリース1では、ドライバから発生した例外のサブセットのみが、このクラスのインスタンスになります。このクラスは、11gリリース1(11.1)では非推奨となり、次のリリースでは削除されます。
|
注意: このクラスの使用はお薦めしません。 |
例外処理は、使用するJDKのバージョンによって異なります。
サーバー側ドライバは、デフォルト・セッションおよびデフォルト・トランザクションのコンテキストで動作します。デフォルト・セッションとは、JVMが起動されたセッションです。サーバー上では、事実上データベースにすでに接続されています。これは、デフォルト・セッションがないクライアント側とは異なります。クライアント側では、明示的にデータベースに接続する必要があります。
サーバーでは、自動コミット・モードは無効になっています。接続オブジェクトで適切なメソッドを使用して、明示的にトランザクションのCOMMITおよびROLLBACK操作を管理する必要があります。
conn.commit();
または
conn.rollback();
|
注意: ベスト・プラクティスとして、サーバー内ではトランザクションをコミットまたはロールバックしないことをお薦めします。 |
クライアント上で実行できるJDBCプログラムはほとんどすべてサーバー上でも実行できます。samplesディレクトリ内のすべてのプログラムは、少し修正するのみでサーバー上で実行できます。通常、修正は接続文に関するもののみです。
データベースへの接続を取得するための次のようなコード・フラグメントについて考えてみます。
ods.setUrl(
"jdbc:oracle:oci:@(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=cluster_alias)
(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=service_name)))");
ods.setUser("scott");
ods.setPassword("tiger");
Connection conn = ods.getConnection();
サーバー側内部ドライバで使用できるように、このコード・フラグメントを変更できます。サーバー側内部ドライバでは、ユーザー、パスワードまたはデータベースの情報は不要です。接続文は次のように記述します。
ods.setUrl( "jdbc:oracle:kprb:@"); Connection conn = ods.getConnection();
ただし、接続を取得するには、次のようにOracleDriver.defaultConnectionメソッドをコールするのが最も便利な方法です。
Connection conn = OracleDriver.defaultConnection();
サーバーにアプリケーションをロードする場合は、クライアントでコンパイル済の.classファイルをロードするか、.javaソース・ファイルをロードして、サーバーで自動的にコンパイルできます。
いずれの場合もloadjavaユーティリティを使用してファイルをロードします。コマンドラインでソース・ファイル名を指定するか、Javaアーカイブ(JAR)ファイルにそのファイルを格納して、コマンドラインでそのJARファイル名を指定します。
実際のユーティリティを実行するloadjavaスクリプトは、Oracleホームのbinディレクトリにあります。このディレクトリは、Oracleをインストールしたパスにあります。
|
注意: loadjavaユーティリティは圧縮ファイルをサポートしています。 |
サーバーへのクラス・ファイルのロード
アプリケーションに3つのクラス・ファイルFoo1.class、Foo2.classおよびFoo3.classがある場合を考えてみます。各クラスは、サーバーで独自のクラス・スキーマ・オブジェクトに書き込まれます。
次のように、JDBC Oracle Call Interface(OCI)のデフォルト・ドライバを使用して、クラス・ファイルをロードできます。
クラス・ファイル名を個別に指定します。
loadjava -user scott Foo1.class Foo2.class Foo3.class
Password: password
ワイルドカードを使用してクラス・ファイル名を指定します。
loadjava -user scott Foo*.class
Password: password
クラス・ファイルが格納されているJARファイルを指定します。
loadjava -user scott Foo.jar
Password: password
次のように、JDBC Thinドライバを使用してファイルをロードできます。
loadjava -thin -user scott@localhost:1521:ORCL Foo.jar
Password: password
|
注意: サーバー側埋込みJVMは、Java Development Kit(JDK)1.5を使用しているため、サーバーにロードする場合は、JDK 1.5でクラスをコンパイルすることをお薦めします。これによって、実行時ではなく、コンパイル時に非互換性が捕捉されます。 |
サーバーへのソース・ファイルのロード
.javaソース・ファイルをロードする際にloadjava -resolveオプションを有効にすると、サーバー側コンパイラはロード時にアプリケーションをコンパイルします。その結果、オリジナル・ソース・コードのソース・スキーマ・オブジェクトとコンパイル済出力の1つ以上のクラス・スキーマ・オブジェクトの両方が生成されます。
-resolveを指定しない場合は、ソースはコンパイルされずに、ソース・スキーマ・オブジェクトにロードされます。ただし、この場合は、ソースで定義されたクラスを最初に使用しようとしたときに、ソースが暗黙的にコンパイルされます。
たとえば、デフォルトのJDBC OCIドライバを使用して、Foo.javaをロードしてコンパイルするには、次のようにloadjavaを実行します。
loadjava -user scott -resolve Foo.java
Password: password
あるいは、次のコマンドを入力し、JDBC Thinドライバを使用してロードします。
loadjava -thin -user scott@localhost:1521:ORCL -resolve Foo.java
Password: password
どちらの場合にも、ソース・スキーマ・オブジェクトに加えて、適切なクラス・スキーマ・オブジェクトが作成されます。
|
注意: 通常はできるかぎりクライアントでソースをコンパイルし、ソース・ファイルではなく、.classファイルをサーバーにロードすることをお薦めします。 |