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


3 - ドライバマネージャ

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

3.1    概要

DriverManager クラスは、ユーザとドライバの間で機能する JDBC の管理レイヤです。このドライバマネージャにより、データベースと適切なドライバとの接続を有効かつ容易に行うドライバを、常に知ることができます。加えて、DriverManager クラスは、ドライバのログイン時間の制限やログのプリントおよびメッセージの追跡などを行います。

単純なアプリケーションにとって、このクラスにおける一般のプログラマが直接に使用しようとする唯一のメソッドは DriverManager.getConnection です。その名前が示すとおり、このメソッドはデータベースへの接続を行います。JDBC によりユーザは、Driver メソッド connect と同様 DriverManager のメソッド、getDrivergetDrivers 、および registerDriver を呼び出せますが、DriverManager のクラスにデータベースとの接続に関する詳細を管理させる方がよい場合が多くみられます。

3.1.1     使用可能なドライバを常に知る方法

DriverManager クラスは、DriverManager.registerManager メソッドの呼び出しによって登録される Driver クラスのリストを持っています。その Driver クラスは、DriverManager クラスによってロードされるタイミングで DriverManager クラスに登録されます。したがって、ユーザは通常 DriverManager.registerDriver を直接呼び出すことはなく、ロード時にドライバによって自動的に呼び出されます。Driver クラスがロードされ自動的に DriverManager に記録されるには、以下の 2 通りの方法があります。

  1. Class.forName メソッドを呼び出す方法。これは明示的にドライバクラスをロードします。これは外部のどのセットアップにも依存していないので、この方法でのドライバのロードを推奨します。acme.db.Driver をロードするコードは以下のとおりです。
        Class.forName("acme.db.Driver");
    
    ロードすることによって、インスタンスを生成して、そのインスタンスを (あるべき形の) パラメータとして DriverManager.registerDriver を呼び出すよう acme.db.Driver が作られていれば、そのドライバは DriverManager のリストに存在し、接続するために使用することができます。

  2. ドライバを java.lang.System プロパティ jdbc.drivers に加える方法。これは DriverManager クラスがロードするドライバのクラス名のリストで、コロンで区切られています。DriverManager クラスが初期化されると、それはシステムプロパティ jdbc.drivers を検索し、ユーザが 1 つ以上のドライバを入力すると、DriverManager クラスがそれらをロードしようとします。以下のコードは、プログラマがどのように ‾/.hotjava/properties に 3 つのドライバクラスを入力するかを説明します。HotJava が起動上のシステムプロパティ内にこれらをロードします。
    jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver;
DriverManager メソッドへの最初の呼び出しは、これらのドライバを自動的にロードします。

ドライバをロードするこの第 2 の方法では、持続的な環境をあらかじめ設定しておく必要があることに注意してください。この環境が設定されていると確信できない場合は、Class.forName メソッドを呼び出して、それぞれのドライバを正確にロードする方が安全です。いったん DriverManager クラスが初期化されると、jdbc.drivers プロパティリストは再チェックをしないため、これが特別なドライバを起動させるために用いるメソッドとなります。

上記の両方の場合において、DriverManager.registerDriver を呼び出して自らを登録することは、新たにロードされた Driver クラスの責任です。前述のとおり、これはクラスのロード時に、自動的に行われる必要があります。

セキュリティ上の理由から、JDBC 管理レイヤはクラスローダがどのドライバを供給するかを追跡します。そして DriverManager クラスが接続を開始するときに、ローカルファイルシステムから得られるドライバ、または接続のための要求を発行するコードと同一のクラスローダから得られるドライバだけを使用します。

3.1.2     接続の確立

Driver のクラスがロードされ、DriverManager クラスに登録されると、それらはデータベースとの接続を確立するために使用可能となります。接続要求が DriverManager.getConnection メソッドに対する呼び出しによって行われると、DriverManager は、順次各ドライバをテストして、接続を確立できるかどうか確認します。

複数の JDBC ドライバが URL と接続できる場合がある可能性があります。たとえば、リモートデータベースに接続する場合、JDBC−ODBC ブリッジドライバ、JDBC- 汎用ネットワークプロトコル間ドライバ、またはデータベースのベンダーが供給するドライバを使用することが可能でしょう。このような場合、DriverManager はその URL に正常に接続できることがわかった最初のドライバを使用するので、ドライバがどの順序でテストされるかは重要です。

DriverManager はまず、登録された順序でドライバを使用しようとします。jdbc.drivers にリストされているドライバは、常に最初に登録されます。DriverManager は、接続を開始しようとしているコードと同一のソースからロードされていない限り、信頼されないコードのドライバをすべて無視します。

DriverManager は、それぞれのメソッド Driverconnect を順次呼び出すことによってドライバをテストし、ユーザが始めにメソッド DriverManager.getConnection に渡した URL をそれらのドライバに渡します。URL を認識した最初のドライバが接続を行います。

この方法は、一見したところ非効率的に見えるかもしれません。しかし、実際には、数ダースものドライバが同時にロードされることはありえないため、2、3 のプロシージャ呼び出しと接続ごとの文字列比較しか必要ではありません。

以下のコードは、JDBC−ODBC ブリッジドライバのようなドライバによって接続をセットアップするために通常要求されるコードの一例です。

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  //loads the driver
    String url = "jdbc:odbc:fred";
    DriverManager.getConnection(url, "userID", "passwd");
    


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