目次 | 前の項目 | 次の項目 JDBCTM ガイド: 使用の開始


2 - 接続

この概要は、現在 Java ソフトウェア で作成中の『JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference』からの引用です。この本は JDBC の自習書であるとともに決定版リファレンスマニュアルで、1997 年春に Addison-Wesley Publishing Company から Java シリーズの一部として発行されています。

2.1    概要

Connection オブジェクトは、データベースとの接続を表します。接続セッションには、実行された SQL 文とその接続を介して返された結果が入ります。1 つのアプリケーションが 1 つのデータベースとの 1 つ以上の接続を持つことも、多くの異なるデータベースとの接続を持つこともできます。

2.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");

2.1.2     URL の一般的な使用

URL に関しては混乱が生じることがよくあるので、まず URL の一般的な説明を手短かに行ってから、JDBC の URL について説明することにします。

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 の残りの部分はファイルに対するパスになります。プロトコルが ftphttp の場合には、URL の残りの部分はホストを指定するもので、より特定のサイトに対するパスをオプションとして指定することもできます。たとえば、以下は、Java ソフトウェア ホームページに対する URL となります。この URL はホストだけを指定します。

    http://java.sun.com
このホームページから、多数のほかのホームページに行くことができます。JDBC ホームページもその 1 つです。JDBC ホームページの URL はより具体的で、次のようになっています。

    http://java.sun.com/products/jdbc

2.1.3     JDBC の URL

JDBC の URL は、適切なドライバがデータベースを認識してそれとの接続を確立するように、データベースを識別する方法を提供します。ドライバの作成者が、その特定のドライバを識別する JDBC URL を何にするかを実際に決定します。ユーザは、JDBC URL をどのような形式するかについては心配する必要はありません。ユーザは、その使用しているドライバが供給する URL を単に使用するだけですみます。JDBC の役割は、単にドライバの作成者が JDBC の URL を構成する際に使用する規則を推奨するだけです。

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 つの部分は以下のように分割できます。

  1. jdbc はプロトコルです。JDBC のURL のプロトコルは常に jdbc です。
        
    
  2. <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 を実際のデータベースに接続するために使用できるような具体的な名前に解決する必要があります。

  3. <subname> は、データベースを識別する方法です。サブネームは、サブプロトコルによってさまざまに変化することができ、ドライバの作成者が選択する、どのような内部構文を使用したサブサブネームをも持つことができます。サブネームのポイントは、データベースを探すために十分な情報を提供することです。上記の例では、ODBC が残りの情報を提供するので、「fred」で十分です。しかし、リモートサーバ上のデータベースでは、もっと多くの情報が要求されます。たとえば、データベースがインターネット経由でアクセスされる場合は、ネットワークアドレスがサブネームの一部として JDBC の URL に含まれるべきである、という標準の URL 命名規則に従う必要があります。
       //hostname:port/subsubname 

dbnet がインターネット上のホストに接続するためのプロトコルだとすると、JDBC の URL は以下のような形になります。

jdbc:dbnet://wombat:356/fred

2.1.4     "odbc" のサブプロトコル

サブプロトコル odbc は、特別なケースです。これは ODBC スタイルのデータソース名を指定する URL のために予約され、サブネーム (データソース名) のあとに任意の数の属性値を指定できるようにする特別な機能を備えています。odbc サブプロトコルの完全な構文は以下のとおりです。

      jdbc:odbc:<data-source-name>[;<attribute-name>=<attribute-value>]*

したがって、以下はすべて有効な jdbc:odbc 名です。

      jdbc:odbc:qeor7
      jdbc:odbc:wombat
      jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER
      jdbc:odbc:qeora;UID=kgh;PWD=fooey

2.1.5     サブプロトコルの登録

ドライバ開発者は、JDBC の URL でサブプロトコルとして使用する名前を予約することができます。DriverManager クラスがこの名前をその登録済みドライバのリストに示すと、この名前に予約されたドライバがそれを認識して、それによって識別されるデータベースへの接続を確立します。たとえば、odbc は JDBC-ODBC ブリッジのために予約されています。また別の例として、仮に Miracle Corporation という企業が存在すれば、その Miracle DBMS に接続する JDBC ドライバのサブプロトコルとして「miracle」を登録して、ほかに誰もその名前を使えないようにします。

Java ソフトウェア は JDBC サブプロトコル名の非公式な登録機関として活動しています。サブプロトコル名を登録するには、以下のアドレスに電子メールを送ります。

      jdbc@wombat.eng.sun.com

2.1.6     SQL 文の送付

いったん確立されると、接続は、SQL 文をその基盤データベースに渡すために使用されます。JDBC は送付される SQL 文の種類について何の制約も課していないので、大きな柔軟性があり、データベース固有の文や SQL でない文でさえも使用することができます。ただしユーザは、基盤となるデータベースが送付される SQL 文を処理できることを確認する責任があり、処理できない場合はその結果を甘受する必要があります。たとえば、アプリケーションが、ストアドプロシージャをサポートしない DBMS にストアドプロシージャ呼び出しを送信しようとすると、正常には処理されず、例外処理を生成します。JDBC は、JDBC COMPLIANTTM として指定されるためには、ドライバが最低 ANSI SQL-2 エントリレベル機能を持つ必要があります。つまり、ユーザは少なくともこの標準レベルの機能はあてにすることができます。

JDBC は、SQL 文をデータベースに送付するために、以下の 3 つのクラスを用意しており、Connection インタフェースの 3 つのメソッドはこれらのクラスのインスタンスを生成します。これらのクラスとクラスを作成するメソッドを、以下に示します。

  1. Statement- -メソッド createStatementによって作成されます。Statement オブジェクトは、簡単な SQL 文の送信に使用されます。
  2. PreparedStatement- -メソッド prepareStatementによって作成されます。PreparedStatement オブジェクトは、1 つ以上のパラメータを入力引数 (IN パラメータ) としてとる SQL 文に使用します。PreparedStatement は IN パラメータの値を設定するメソッドのグループを持ち、これらの IN パラメータは文が実行されるときにデータベースに送付されます。PreparedStatement のインスタンスは、Statement を継承しているため Statement メソッドを含みます。PreparedStatement オブジェクトはコンパイル済みで、将来の使用に備えて格納されているので、Statement オブジェクトよりも効率的に使用できる能力を潜在的に備えています。
  3. CallableStatement- -メソッド prepareCall によって作成されます。CallableStatement オブジェクトは、SQL ストアドプロシージャ (一連の SQL 文で、関数を起動するのとまったく同様に、名前によって呼び出されます) を実行するために使用します。CallableStatement オブジェクトは、IN パラメータを処理するためのメソッドを PreparedStatement から継承し、これは、OUT および INOUT パラメータを処理するためのメソッドを追加します。
以下のリストは、異なるタイプの SQL 文を作成するために、どちらの Connection メソッドが適切かを素早く判定する方法を示します。

createStatement メソッドは以下のために使用する

prepareStatement メソッドは以下のために使用する

prepareCall メソッドは以下のために使用する

2.1.7     トランザクション

トランザクションは、コミットもしくはロールバックされた 1 つ以上の実行が完了した文で構成されます。メソッド commit または rollback が呼び出されると、現在のトランザクションが終了して、別のトランザクションが開始されます。

デフォルトでは、新しい接続はオートコミットモードになっています。つまり、文が完了すると、メソッド commit が自動的にその文で呼び出されます。この場合、各文が個々にコミットされ、トランザクションが 1 つの文によってだけ構成されます。オートコミットモードが無効になっていると、トランザクションはメソッド commit または rollback が明示的に呼び出されるまで終了しないので、commit または rollback メソッドが最後に起動されて以降の実行されたすべての文を含みます。この 2 番目の場合、トランザクションの文はすべてグループとしてコミットまたはロールバックされます。

メソッド commit は、SQL 文がデータベースに対して加えたあらゆる変更を反映し、トランザクションによってかけられたロックをすべて開放します。メソッド rollback はそれらの変更を破棄します。

ユーザはほかの変更が同時に有効にならない限り、その変更も有効にしたくない場合があります。これは、オートコミットを無効にし、両方の更新内容を 1 つのトランザクションにグループ化することによって実現できます。両方の更新が正常に行われると、commit メソッドが呼び出され、両方の更新の結果をデータベースに反映します。1 つまたは両方が失敗した場合、rollback メソッドが呼び出され、全ての更新を破棄します。

ほとんどの JDBC ドライバはトランザクションをサポートします。実際、JDBC 準拠のドライバは、トランザクションをサポートする必要があります。DatabaseMetaData は、DBMS が提供するトランザクションサポートのレベルについての情報を提供します。

2.1.8     トランザクションの遮断レベル

DBMS がトランザクション処理をサポートする場合、DBMS には、2 つのトランザクションが 1 つのデータベース上で同時に稼動しているときに生じ得る、潜在的な競合を管理する方法がいくつかあります。ユーザは、潜在的な競合を解決するのに、DBMS がどの程度の注意を払う必要があるかを示すトランザクションの遮断レベルを指定することができます。たとえば、あるトランザクションが値を変更し、変更がコミットまたはロールバックされる前に、2 番目のトランザクションがその値を読み取るとどうなるか。最初のトランザクションがロールバックした場合、2 番目のトランザクションが読み取った、変更された値が無効だということが許容されるのか。JDBC ユーザは、以下のコードを使用して (con は現在の接続)、コミットされる前に値を読めるように (ダーティ読み取り) 指示することができます。

    con.setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED);
トランザクションの遮断レベルが高くなればなるほど、競合を避けるための注意がより多く払われます。Connection インタフェースは、トランザクションがまったくサポートされない最低レベルから、1 つのトランザクションがデータベース上で操作している間に、そのトランザクションが読み取っているデータに対して、ほかのトランザクションが変更を行わないという最高レベルまで、5 段階のレベルを定義します。通常、遮断のレベルが高くなると、アプリケーションを実行する速度は低下します (ロッキングによるオーバヘッドが増大し、ユーザ間の同時使用が低減するため)。どの遮断レベルを使用するかを決定するときは、開発者はパフォーマンス上のニーズとデータの一貫性について、ニーズのバランスを取る必要があります。もちろん、実際にサポートされるレベルは、基盤の DBMS の能力に依存します。

Connection オブジェクトが新たに作成されると、そのトランザクションの遮断レベルは、ドライバによりますが、通常の場合には基盤のデータベースのデフォルト値になります。ユーザはメソッド setIsolationLevel を呼び出して、トランザクションの遮断レベルを変更し、残りの接続セッションでは新しいレベルを有効にすることができます。1 つのトランザクションについてだけ、トランザクションの遮断レベルを変更するには、そのトランザクションが開始する前に遮断レベルを設定し、トランザクションが終了したあとにそれをリセットする必要があります。トランザクションの最中にトランザクションの遮断レベルを変更すると、メソッド commit への即時呼び出しのトリガがかかり、その時点までに行われたすべての変更がデータベースに反映されるので、これはお勧めできません。



目次 | 前の項目 | 次の項目
jdbc@wombat.eng.sun.com または jdbc-odbc@wombat.eng.sun.com
Copyright (C) 1996, 1997 Sun Microsystems, Inc. All rights reserved.