| 目次 | 前の項目 | 次の項目 | JDBCTM ガイド: 使用の開始 |
Connection オブジェクトは、データベースとの接続を表します。接続セッションには、実行された SQL 文とその接続を介して返された結果が入ります。1 つのアプリケーションが 1 つのデータベースとの 1 つ以上の接続を持つことも、多くの異なるデータベースとの接続を持つこともできます。
DriverManager.getConnection を呼び出すことです。このメソッドは、URL の入った文字列をパラメータとして受け取ります。JDBC 管理レイヤと呼ばれる
DriverManager クラスは、URL が表すデータベースに接続できるドライバの検索を試みます。DriverManager クラスは登録済みの Driver クラスのリストを持ち、メソッド
getConnection が呼び出されると、URL で指定されたデータベースに接続できるドライバが見つかるまで、リストの中の各ドライバを確認します。Driver のメソッドの connect は、この URL を使用して実際に接続を確立します。
ユーザは、JDBC 管理レイヤをバイパスして、Driver メソッドを直接呼び出すことができます。これは、2 つのドライバがデータベースに接続でき、ユーザが特定のドライバを明示的に選択するというまれなケースでは役に立ちます。しかし、通常は、DriverManager クラスに接続の開始を処理させる方がはるかに簡単です。
以下のコードは、"oboy" という ID と "12Java" というパスワードを使用して URL "jdbc:odbc:wombat" にあるデータベースへの接続を開始する例を示します。
String url = "jdbc:odbc:wombat";
Connection con = DriverManager.getConnection(url, "oboy", "12Java");
URL (Uniform Resource Locator) は、インターネット上のリソースの位置を指定するために使用します。これはアドレスと考えることができます。
URL の最初の部分で、情報にアクセスするために使用するプロトコルを指定します。そのあとには常に、コロンが続きます。よく使用されるプロトコルには、ファイル転送プロトコルを指定する「ftp」とハイパーテキスト転送プロトコルを指定する「http」があります。プロトコルが「file」の場合には、リソースがインターネット上ではなく、ローカルファイルシステム中にあることを示します (以下の例中の下線は、説明対象の URL の部分を示すために使用しているもので、URL の一部ではない)。
ftp://javasoft.com/docs/JDK-1_apidocs.zip
http://java.sun.com/products/jdk/CurrentRelease
file:/home/haroldw/docs/books/tutorial/summary.html
URL の最初のコロンのあとに続く残りの部分はすべて、データソースがどこにあるかを指定するものです。プロトコルが file の場合には、URL の残りの部分はファイルに対するパスになります。プロトコルが ftp と http の場合には、URL の残りの部分はホストを指定するもので、より特定のサイトに対するパスをオプションとして指定することもできます。たとえば、以下は、Java ソフトウェア ホームページに対する URL となります。この URL はホストだけを指定します。
http://java.sun.comこのホームページから、多数のほかのホームページに行くことができます。JDBC ホームページもその 1 つです。JDBC ホームページの URL はより具体的で、次のようになっています。
http://java.sun.com/products/jdbc
JDBC の URLは、さまざまな種類のドライバで使用するため、規則は当然、非常に柔軟です。まず、この規則では、異なるドライバがデータベースを名付けるための異なる仕組みを使用できます。たとえば、odbc サブプロトコルを使用すると、URL に属性値を含めることができます。ただし、必要とする訳ではありません。
第 2 に、JDBC の URLにより、ドライバの作成者が必要な接続情報をそれの中にエンコードできるようになります。これにより、たとえば、アプレットがデータベースとやり取りを行おうとする際、ユーザが何らの管理作業を行うことなくデータベース接続を開始することができます。
第 3 に、JDBC の URL では間接的なレベルが可能です。すなわち、JDBC の URL が、論理ホストまたはネットワークネーミングシステムによって、実際の名前に動的に翻訳されるデータベース名を参照できるということです。これにより、システム管理者は特定のホストを JDBC 名の一部として指定しなくてすみます。ネットワークネームサービスにはいくつかの異なる種類 (たとえば、DNS、NIS、およびDCE) があり、どれを使用するかについての制約はありません。
JDBC URL の標準構文は以下のとおりです。その構文には 3 つの部分があり、コロンによって区切られています。
jdbc:<subprotocol>:<subname>JDBC の URL の 3 つの部分は以下のように分割できます。
jdbc はプロトコルです。JDBC のURL のプロトコルは常に jdbc です。
<subprotocol> は通常、ドライバ名またはデータベース接続メカニズムの名前で、1 つ以上のドライバによってサポートすることができます。サブプロトコル名の顕著な例は、「odbc」で、これは ODBC スタイルデータソース名を指定する URL のために予約されていました。たとえば、JDBC-ODBC ブリッジによってデータベースにアクセスするには、以下のように URL を使用します。
jdbc:odbc:fred この例では、サブプロトコルは odbc で、サブネーム fred はローカルの ODBC データソースです。
ネットワークネームサービスを使用したい (JDBC の URL 中のデータベースの名前を実際の名前にする必要をなくしたい) 場合には、ネームサービスはサブプロトコルにすることができます。すなわち、たとえば、次のような URL を持っているものとします。
jdbc:dcenaming:accounts-payableこの例では、ローカルの DCE のネームサービスを指定する URL は、データベース名 accounts-payable を実際のデータベースに接続するために使用できるような具体的な名前に解決する必要があります。
<subname> は、データベースを識別する方法です。サブネームは、サブプロトコルによってさまざまに変化することができ、ドライバの作成者が選択する、どのような内部構文を使用したサブサブネームをも持つことができます。サブネームのポイントは、データベースを探すために十分な情報を提供することです。上記の例では、ODBC が残りの情報を提供するので、「fred」で十分です。しかし、リモートサーバ上のデータベースでは、もっと多くの情報が要求されます。たとえば、データベースがインターネット経由でアクセスされる場合は、ネットワークアドレスがサブネームの一部として JDBC の URL に含まれるべきである、という標準の URL 命名規則に従う必要があります。
//hostname:port/subsubname
dbnet がインターネット上のホストに接続するためのプロトコルだとすると、JDBC の URL は以下のような形になります。
odbc は、特別なケースです。これは ODBC スタイルのデータソース名を指定する URL のために予約され、サブネーム (データソース名) のあとに任意の数の属性値を指定できるようにする特別な機能を備えています。odbc サブプロトコルの完全な構文は以下のとおりです。
jdbc:odbc:<data-source-name>[;<attribute-name>=<attribute-value>]*
したがって、以下はすべて有効な jdbc:odbc 名です。
jdbc:odbc:qeor7jdbc:odbc:wombatjdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWERjdbc:odbc:qeora;UID=kgh;PWD=fooey
DriverManager クラスがこの名前をその登録済みドライバのリストに示すと、この名前に予約されたドライバがそれを認識して、それによって識別されるデータベースへの接続を確立します。たとえば、odbc は JDBC-ODBC ブリッジのために予約されています。また別の例として、仮に Miracle Corporation という企業が存在すれば、その Miracle DBMS に接続する JDBC ドライバのサブプロトコルとして「miracle」を登録して、ほかに誰もその名前を使えないようにします。
Java ソフトウェア は JDBC サブプロトコル名の非公式な登録機関として活動しています。サブプロトコル名を登録するには、以下のアドレスに電子メールを送ります。
jdbc@wombat.eng.sun.com
JDBC は、SQL 文をデータベースに送付するために、以下の 3 つのクラスを用意しており、Connection インタフェースの 3 つのメソッドはこれらのクラスのインスタンスを生成します。これらのクラスとクラスを作成するメソッドを、以下に示します。
Statement- -メソッド createStatementによって作成されます。Statement オブジェクトは、簡単な SQL 文の送信に使用されます。
PreparedStatement- -メソッド prepareStatementによって作成されます。PreparedStatement オブジェクトは、1 つ以上のパラメータを入力引数 (IN パラメータ) としてとる SQL 文に使用します。PreparedStatement は IN パラメータの値を設定するメソッドのグループを持ち、これらの IN パラメータは文が実行されるときにデータベースに送付されます。PreparedStatement のインスタンスは、Statement を継承しているため Statement メソッドを含みます。PreparedStatement オブジェクトはコンパイル済みで、将来の使用に備えて格納されているので、Statement オブジェクトよりも効率的に使用できる能力を潜在的に備えています。
CallableStatement- -メソッド prepareCall によって作成されます。CallableStatement オブジェクトは、SQL ストアドプロシージャ (一連の SQL 文で、関数を起動するのとまったく同様に、名前によって呼び出されます) を実行するために使用します。CallableStatement オブジェクトは、IN パラメータを処理するためのメソッドを PreparedStatement から継承し、これは、OUT および INOUT パラメータを処理するためのメソッドを追加します。
Connection メソッドが適切かを素早く判定する方法を示します。
createStatementメソッドは以下のために使用する
- 簡単な SQL 文 (パラメータなし)
prepareStatementメソッドは以下のために使用する
prepareCallメソッドは以下のために使用する
- ストアドプロシージャへの呼び出し
commit または
rollback が呼び出されると、現在のトランザクションが終了して、別のトランザクションが開始されます。
デフォルトでは、新しい接続はオートコミットモードになっています。つまり、文が完了すると、メソッド commit が自動的にその文で呼び出されます。この場合、各文が個々にコミットされ、トランザクションが 1 つの文によってだけ構成されます。オートコミットモードが無効になっていると、トランザクションはメソッド commit または rollback が明示的に呼び出されるまで終了しないので、commit または rollback メソッドが最後に起動されて以降の実行されたすべての文を含みます。この 2 番目の場合、トランザクションの文はすべてグループとしてコミットまたはロールバックされます。
メソッド commit は、SQL 文がデータベースに対して加えたあらゆる変更を反映し、トランザクションによってかけられたロックをすべて開放します。メソッド rollback はそれらの変更を破棄します。
ユーザはほかの変更が同時に有効にならない限り、その変更も有効にしたくない場合があります。これは、オートコミットを無効にし、両方の更新内容を 1 つのトランザクションにグループ化することによって実現できます。両方の更新が正常に行われると、commit メソッドが呼び出され、両方の更新の結果をデータベースに反映します。1 つまたは両方が失敗した場合、rollback メソッドが呼び出され、全ての更新を破棄します。
ほとんどの JDBC ドライバはトランザクションをサポートします。実際、JDBC 準拠のドライバは、トランザクションをサポートする必要があります。DatabaseMetaData は、DBMS が提供するトランザクションサポートのレベルについての情報を提供します。
con は現在の接続)、コミットされる前に値を読めるように (ダーティ読み取り) 指示することができます。
con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);トランザクションの遮断レベルが高くなればなるほど、競合を避けるための注意がより多く払われます。
Connection インタフェースは、トランザクションがまったくサポートされない最低レベルから、1 つのトランザクションがデータベース上で操作している間に、そのトランザクションが読み取っているデータに対して、ほかのトランザクションが変更を行わないという最高レベルまで、5 段階のレベルを定義します。通常、遮断のレベルが高くなると、アプリケーションを実行する速度は低下します (ロッキングによるオーバヘッドが増大し、ユーザ間の同時使用が低減するため)。どの遮断レベルを使用するかを決定するときは、開発者はパフォーマンス上のニーズとデータの一貫性について、ニーズのバランスを取る必要があります。もちろん、実際にサポートされるレベルは、基盤の DBMS の能力に依存します。
Connection オブジェクトが新たに作成されると、そのトランザクションの遮断レベルは、ドライバによりますが、通常の場合には基盤のデータベースのデフォルト値になります。ユーザはメソッド setIsolationLevel を呼び出して、トランザクションの遮断レベルを変更し、残りの接続セッションでは新しいレベルを有効にすることができます。1 つのトランザクションについてだけ、トランザクションの遮断レベルを変更するには、そのトランザクションが開始する前に遮断レベルを設定し、トランザクションが終了したあとにそれをリセットする必要があります。トランザクションの最中にトランザクションの遮断レベルを変更すると、メソッド commit への即時呼び出しのトリガがかかり、その時点までに行われたすべての変更がデータベースに反映されるので、これはお勧めできません。