目次 | 前の項目 | 次の項目 JDBCTM ガイド: 入門


6 データベース接続

インタフェースの完全な説明については、第 13 章の Java のインタフェースの説明を参照してください。

6.1     接続を開く

データベースにアクセスするときは、JDBC 管理層の java.sql.DriverManager.getConnection メソッドを使って java.sql.Connection オブジェクトを取得します。

DriverManager.getConnection メソッドは引数として URL を受け取ります。JDBC 管理層は、その URL で表されるデータベースに接続可能なドライバを探します。JDBC 管理層は、各ドライバに、指定された URL に接続できるかどうかを順番に問い合わせる (6.2 項を参照) ことによりこれを行います。1 ドライバは、その URL が自分のサポートしているサブプロトコルを指定しているかどうかを調べ (6.3 項を参照)、指定している場合は、そのデータベースへの接続を試みます。接続の確立に成功すると、適切な java.sql.Connection オブジェクトを返します。

java.sql.Connection オブジェクトからは、java.sql.Statement、java.sql.PreparedStatement、java.sql.CallableStatement オブジェクトを取得でき、それらのオブジェクトを使って SQL 文を実行できます。

また、接続中には、アプリケーションは JDBC 管理層をバイパスして、明示的に特定のドライバを選んで使用することが許可されます。

6.2     ドライバの選択

一部の JDBC ドライバでは、指定された URL への接続が可能な場合があります。たとえば、指定されたリモートデータベースに接続するとき、JDBC-ODBC ブリッジドライバと汎用ネットワークプロトコルドライバへの JDBC のどちらかが使用可能なことがあります。または、データベースのベンダが提供するドライバを使用できる場合もあります。

JDBC では、ユーザが Java プロパティ jdbc.drivers を設定してドライバのリストを指定することができます。このプロパティを定義する場合は、ドライバのクラス名のリストをコロンで区切って、たとえば「acme.wonder.Driver:foobaz.openNet.Driver:vendor.OurDriver」のように記述します。

ドライバを探すとき、JDBC は指定された URL に接続可能なドライバのうち、最初に見つかったものを使用します。JDBC は最初、sql.drivers リストに指定されている各ドライバから、指定されている順序で探します。次に、ロード済みのドライバから、ロードされた順に探します。ドライバが「信頼されない」コードの場合、接続を試みているコードと同じソースからロードされたドライバでない限り、そのドライバはスキップされます (第 5 章のセキュリティの説明を参照)。

6.3     URL

6.3.1 JDBC データベースの命名の目標

アプリケーションの開発者が接続するデータベースを指定するためには、データベースの命名規則が定まっている必要があります。

JDBC 命名機構には次の特性があります。

  • ドライバごとに異なる方法でデータベースを命名できます。たとえば、 JDBC-ODBC ブリッジドライバが単純な ODBC スタイルのデータソース名をサポートする一方で、ネットワークプロトコルドライバは、接続先のホスト名とポートを知るためにさらに情報を必要とする場合があります。
  • 指定されたデータベースにアクセスしようとするアプレットをダウンロードする場合は、ユーザが煩雑なシステム管理作業を行わなくてもデータベース接続を開けるようにします。たとえば、人間が管理する必要のある、クライアントマシン上の ODBC データソーステーブルのようなものが必要になることは避けたいと考えます。つまり、必要な接続情報はすべて JDBC 名の中に符号化できる必要があります。
  • JDBC の名前には一定レベルの間接指定を許可し、最初の名前をなんらかのネットワークネーミングシステムで解釈してデータベースを特定できるようにします。これにより、システム管理者は特定のホストを JDBC の名前の一部として指定する必要がなくなります。しかし、ネットワークネームサービスにはさまざまな種類 (NIS、DCE など) があるので、ある特定のネットワークネーミングサーバの使用を強制することはしません。

    6.3.2 URL の構文

    World Wide Web では、このようなプロパティをすべてサポートする命名システムが標準化されています。これが、Uniform Resource Locator (URL) 機構です。そこで私たちは、JDBC の命名に URL を使うことを提案し、JDBC URL 構造の規則をいくつか推奨します。

    JDBC URL の推奨構造は次のとおりです。

    jdbc:<サブプロトコル>:<サブネーム>

    サブプロトコルには、1 つまたは複数のドライバがサポートするデータベースコネクティビティ機構の特定の種類を名付けます。サブネームの内容と構文は、サブプロトコルに依存します。

    サブネームの一部としてネットワークアドレスを指定する場合は、標準 URL のサブネームのためのネーミング規約「//hostname:port/subsubname」に従うことをお勧めします。サブネームは任意の内部構文を持つことができます。

    6.3.3 URL の例

    たとえば JDBC-ODBC ブリッジを通じてデータベースにアクセスするには、次のような URL を使用します。

    jdbc:odbc:fred

    この例では、サブプロトコルは odbc で、サブネームはローカルの ODBC データソース名 fred です。JDBC-ODBC ドライバは、サブプロトコル odbc を持つ URL を検索してから、ODBC SQLConnect でサブネームを使用できます。

    汎用のデータベースコネクティビティプロトコル dbnet を使用してデータベースリスナーと通信する場合は、次のような URL を使用します。

    jdbc:dbnet://wombat:356/fred

    この URL は、「ホスト wombat のポート 356 に接続するために dbnet プロトコルを使用し、目的のデータベースを探すためにそのポートにサブネーム fred を提示する」ことを指定しています。

    ネットワークのネームサービスを使ってデータベース名の中で間接指定を行いたい場合は、サブプロトコルとしてネームサービス名を使用することを推奨します。この場合の URL は次のようになります。

    jdbc:dcenaming:accounts-payable

    この URL は、「ローカルの DCE ネームサービスを使ってデータベース名 accounts-payable を解釈して、実際のデータベースへの接続に使用できる特定の名前に変換する」ことを指定しています。場合によっては、疑似ドライバを準備して、ネットワークネームサーバを通じて名前の検索を行なってから、その結果情報を使って実際のドライバを探し、実際の接続を開くと良い場合があります。

    6.3.4 ドライバが構文を選択して、他の URL を無視する

    JDBC URL 機構の目標は、異なるドライバがそれぞれの必要に応じた異なるネーミングシステムを使用できるようなフレームワークを提供することです。各ドライバが理解する必要のある URL のネーミング構文はただ一つであり、他の URL に遭遇した場合はそれを拒否することができます。

    6.3.5 サブプロトコル名の登録

    Java ソフトウェアは、JDBC サブプロトコル名の非公式の登録機関として働きます。サブプロトコル名を予約するには、jdbc@wombat.eng.sun.com にメールを送ってください。

    6.3.6 odbc サブプロトコル

    odbc サブプロトコルは、ODBC スタイルのデータソース名を指定する URL のために予約されています。このサブプロトコルのために、URL 構文の仕様を、データソース名の後ろに任意の属性値を指定できるものにしました。

    odbc サブプロトコルの完全な URL 構文は次のとおりです。

    jdbc:odbc:<データソース名>[;<属性名>=<属性値>]*
    
    したがって、次の jdbc:odbc 名は有効です。

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

    6.4     接続の引数

    接続を開くときは、java.util.Properties オブジェクトを引き渡すことができます。このオブジェクトは、タグ文字列と値の文字列の間をマッピングするプロパティのセットです。慣習的に、「user」と「password」の 2 つのプロパティが使用されます。ドライバによっては、これ以外のプロパティを指定して使用してもかまいません。

    アプレットに汎用的なデータベースアクセスを可能にするため、できるだけ多くの接続情報を URL の一部に符号化し、ドライバでなるべくプロパティセットを使用しないようなプログラミングを推奨します。

    6.5     複数の接続

    1 つのアプリケーションで、2 つ以上のドライバを使って 2 つ以上のデータベースへの接続を維持することができます。

    6.6     ドライバの登録

    JDBC 管理層では、どのドライバが利用可能かを知る必要があります。これには 2 つの方法があります。

    JDBC の java.sql.DriverManager クラスは初期化時に、システムプロパティの中で sql.drivers プロパティを探します。このプロパティが存在する場合は、コロンで区切られたドライバクラス名のリストになっているはずです。このリストの各クラスは java.sql.Driver インタフェースを実装しています。DriverManager クラスは、この各 Driver クラスをロードしようとします。

    もう 1 つの方法として、プログラマが標準の Class.forName メソッドを使って明示的にドライバクラスをロードすることができます。たとえば、acme.db.Driver クラスをロードするには次のようにします。

    Class.forName("acme.db.Driver");
    
    
    
    どちらの場合も、新しくロードされた Driver クラスには、DriverManager.registerDriver メソッドを使って自ら DriverManager に登録する責任があります。これにより、DriverManager がデータベース接続を作成しようとするとき、このドライバを使用できます。

    セキュリティ上の理由から、JDBC 管理層はどのクラスローダがどのドライバを提供したかという記録を保持し、接続を開くときには、ローカルファイルシステム、または getConnection 要求を発行したコードと同じクラスローダから提供されるドライバだけを使用します。



    目次 | 前の項目 | 次の項目
    1 これは一見、効率的ではなく思われます。しかし、大量のドライバが同時にロードされることはあまりないので、接続ごとに見ると、いくつかのプロシージャ呼び出しと文字列比較が必要なだけです。

    jdbc@wombat.eng.sun.com または jdbc-odbc@wombat.eng.sun.com
    Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.