3

[1] JDBC では、最初に Class.forName("some driver name") を使用してドライバーをロードする必要があるのはなぜですか。SUN が getConnection() メソッド自体でドライバのロードを処理しなかったのはなぜですか。ドライバ名をパラメータとして getConnection() メソッドに渡した場合。

[2] JBDC の内部構造を理解したいと思っています。

4

3 に答える 3

8

JDBC 4 では、Class.forName(...) を使用する必要がなくなりました。これについて説明している記事については、こちらを参照してください。

データベースに接続するには、適切な JDBC データベース ドライバーがクライアントの VM にロードされている必要があります。JDBC の初期の頃は、Class.forName() を介して適切なドライバーをロードし、JDBC ドライバー インターフェイスを実装するクラスの名前を渡すのが一般的でした。DriverManager クラスは後に、クライアント アプリケーションで JDBC ドライバーを管理するより柔軟な手段を提供しました。ドライバーを使用可能にするには、DriverManager の registerDriver() をドライバーのクラス名で呼び出す必要がありました。または、jdbc.drivers システム プロパティを介してロードするドライバーを指定することもできます。DriverManager が初期化されると、そのプロパティに関連付けられたドライバーをロードしようとします。

JDBC 4 では、データベース ドライバを指定する別の手段としてJ2SE サービス プロバイダメカニズムが追加されています。これが機能するには、ドライバー JAR ファイルにファイル META-INF/services/java.sql.driver が含まれている必要があります。そのファイルには、JDBC ドライバーの Driver インターフェースの実装の名前を含む 1 行が含まれている必要があります。DriverManager で getConnection() を呼び出すと、必要に応じてパッケージ化されたドライバーが読み込まれます。ドライバーをロードすると、ドライバーのインスタンスが作成され、registerDriver() が呼び出されて、そのドライバーがクライアントで使用できるようになります。

JDBCの詳細については、Sun の JDBC リンクを参照してください。JDBC 4.0 仕様は、他の仕様に比べて比較的読みやすいです...

于 2008-11-06T15:44:41.610 に答える
1

JDBC プロトコル名のみを指定した場合、java.sql がどのクラスをロードするかを知る方法はありません。おそらく、JDBC ドライバー jar ファイルは、マニフェスト内または META-INF/ の下の他の場所で、プロトコル名とドライバー クラスを指定できる必要があります。私の意見では、ハードワイヤードの文字列や手間のかかるサービス ファイルを使用してクラスをロードするよりも、自分でドライバー インスタンスを作成する方がよいでしょう。

JDBC 自体にはあまり意味がありません。ソースは JDK の src.zip にあります。DriverManager はコード付きのクラスです。

于 2008-11-06T15:52:44.137 に答える
0

ツールキットは正しかった。JDBC 4.0 以降、ドライバーがJ2SE Service Providerを使用して自動的に登録するメカニズムがあります。残念ながら、すべての JDBC ベンダーがドライバーを更新したわけではありません。また、現在 JDBC 4.0 をサポートする JDBC ドライバーはそれほど多くないと思います。その間、ドライバーを登録するためにドライバーのインスタンスを作成する必要があります。DriverManager は、DriverManager.getConnection() に渡された JDBC URL を受け入れるかどうか、登録されている各ドライバーをチェックします。ドライバーのログを有効にして、ドライバーが登録されていて、DriverManager が適切なドライバーを見つけようとした場合に何が起こるかを確認できます。したがって、前に DriverManager.setLogStream() または DriverManager.setLogWriter() を呼び出すだけです。

これは私が知っている JDBC 4.0 ドライバーの 1 つです: http://www.inetsoftware.de/products/jdbc/mssql/merlia

于 2008-11-10T11:11:25.560 に答える