2013-08-17 8 views
11

JDBCのバージョン4での偉大な追加の1つ ドライバを明示的にロードする必要はありません。Class.forNameを呼び出すことにより、アプリケーションがデータベースに初めて接続しようとすると、は、 のアプリケーションCLASSPATHにあるドライバを自動的に読み込みます。ドライバクラスはJDBC4にどのように配置されますか

私の質問はどうですか?クラスパスに複数のドライバがある場合はどうなりますか?

私が推測できることの1つは、ドライバに必要なドライバがJDBCであるかODBCであるかにかかわらず、接続URLを解析することです。しかし、データベース用に選択される複数のjdbc準拠のドライバ使用していますか? (MySqlを使用していて、MySql-Connectorドライバが必要だと言うことができます)。 JVMにそのようなデータベースドライバの静的マッピングがありますか?

+0

なぜドライバが必要ですか? –

+2

他にどのようにデータベースに接続しますか?伝統的に私たちはClass.ForName(ドライバ)を行います。 –

+0

@atamanroman私はあなたに説明することは何もないので、あなたの専門用語をそのまま使用してください。 –

答えて

10

から採取JDBC4ドライバローディングに関するいくつかの情報:http://www.onjava.com/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

getConnectionメソッドが呼び出されると、DriverManagerは、JDBC は、初期化時にロードされたことをドライバ及びそれらの中から適切なドライバを検索する 試みます現在のアプリケーションと同じクラスローダ を使用して明示的にロードされます。

DriverManagerのメソッドgetConnectionおよびgetDriversは、Java SE Service Provider Mechanism(SPM)をサポートするように拡張された です。 SPMによれば、サービスは、よく知られた インターフェイスと抽象クラスのセットとして定義され、サービスプロバイダは特定のサービスの 実装です。また、サービス のプロバイダ設定ファイルがMETA-INF/services ディレクトリに格納されることも指定します。 JDBC 4.0ドライバには、ファイル META-INF/services/java.sql.Driverが含まれている必要があります。このファイルには、 JDBCドライバのjava.sql.Driverの実装の名前が含まれています。

org.apache.derby.jdbc.EmbeddedDriver 

今すぐに来る:例えば、Apache Derbyデータベースに接続するために JDBCドライバをロードするために、 META-INF /サービス/に、java.sql.driverファイルには、次の のエントリが含まれますあなたの質問。

私の質問はどうですか? クラスパスに複数のドライバがある場合はどうなりますか?

クラスローダールールとして、最初に見つかったクラスがロードされ、既にロードされている場合はクラスローダーによって再ロードされません。

10

すべてのJDBC 4準拠ドライバには、META-INF/services/java.sql.Driverという名前のjarファイルがあり、そのファイルにはjava.sql.Driverの実装がリストされます。接続をリクエストすると、DriverManagerServiceLoaderを使用してクラスパスにMETA-INF/services/java.sql.Driverのすべての(!)コピーを検索し、リストされたすべてのクラスをロードします。 java.sql.Driverクラスがロードされると、DriverManagerに自身を登録する必要があるため、DriverManagerはサービスローダーを使用してすべてのクラスをロードし、各Driver実装はそれ自体を登録します。

DriverManagerから接続を要求すると、DriverManagerは登録済みのすべてのドライバに対して、Connectionを要求します。ドライバはJDBC URLを使用して、そのプロトコルがサポートしているプロトコルかどうかを確認します(例:URLが"jdbc:firebirdsql:"または"jdbc:firebird:"で始まるかどうかJaybird/Firebird JDBCがチェックします)。ドライバがプロトコルをサポートしていない場合は、nullを返します。プロトコルをサポートしていれば、確立された接続を返します。または、SQLExceptionをスローします(たとえば、URLにエラーがあった場合、接続する)。すべてのドライバが(なしプロトコルをサポート)nullを返す場合は、DriverManagerだから、クラスパス上の複数のドライバがために、複数のドライバがあるがあれば、限り、彼らは異なるプロトコルをサポートしてもかまいません持つエラー"No suitable driver found for <url>"

SQLExceptionがスローされます同じデータベース(または少なくとも同じプロトコル接頭辞)を使用する場合は、ドライバのリストの最初のものを使用し、そのドライバがSQLExceptionで失敗すると、もう1つは試行しません。

0

JDBC 4では、ドライバが自動的に登録されます。これはどうですか? 我々は

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/sonoo","root","root"); 

を書くとき、これはDriverManagerクラス内の静的ブロックを呼び出します。あなたがDriverManagerのソースファイルを開いた場合、あなたは静的なブロックに

static { 
     loadInitialDrivers(); 
     println("JDBC DriverManager initialized"); 
    } 

を見ることができ、これは機能loadInitialDrivers();関数を呼び出すと、すべてのドライバをロードすると自動的に登録されます。したがって、ドライバを明示的に登録またはロードする必要はありません。

関連する問題