web-dev-qa-db-ja.com

JDBC Class.forName vs DriverManager.registerDriver

JDBCドライバーをロードして登録するためのforNameメソッドとregisterDriverとの違いはどれですか?

61
xdevel2000

Class.forName() はJDBCとは直接関係していません。クラスをロードするだけです。

ほとんどのJDBCドライバークラスは、 registerDriver() を呼び出して、静的イニシャライザーに登録します。

registerDriver()は、自分で呼び出す必要がほとんどない実際の呼び出しです(独自のJDBCドライバーを作成しない限り)。

JDBC 4では、JDBCドライバーが最新の場合、サービスの場所を使用してドライバーを見つけることができるため、これらのいずれも必要がないことに注意してください代わりにメカニズム(つまり、その呼び出しを省略して、通常どおり接続を開きます)。詳細については、 DriverManagerのドキュメント を参照してください。

DriverManagerのメソッドgetConnectionおよびgetDriversは、Java Standard Edition Service Providerメカニズムをサポートするように拡張されています。JDBC4.0ドライバーには、ファイルMETA-INF/services/Java.sql.Driverが含まれている必要があります。 Java.sql.DriverのJDBCドライバ実装の名前。たとえば、my.sql.Driverクラスをロードするには、META-INF/services/Java.sql.Driverファイルに次のエントリが含まれます。

my.sql.Driver

アプリケーションは、Class.forName()を使用してJDBCドライバーを明示的にロードする必要がなくなりました。現在Class.forName()を使用してJDBCドライバーをロードする既存のプログラムは、変更なしで引き続き動作します。

83
Joachim Sauer

DriverManager.registerDriver()メソッドを手動で呼び出さないでください。 JDBC仕様では、クラスがロードされるときにドライバーが自身を登録する必要があり、クラスはClass.forName()を介してロードされます。 JDBC 4では、クラスパス上にあるだけで、ドライバーを自動的にロードできます。

DriverManager.registerDriver()は、ドライバーを実際に2回登録するため、手動で危険な可能性があります。コードでメモリリークを防ぐためにドライバの登録を解除する必要がある場合は、一度登録を解除して、2番目のインスタンスを登録したままにしてください。

19
David O'Meara