目次 | 前項目 | 次項目 JDBCTM ガイド: 「はじめましょう」


3 - ドライバマネージャ

この概要は、現在 JavaSoft で作成中の 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.