2011-10-05 14 views
17

私は、クラスの読み込みはクラスを実行時にそのクラス名でロードするのに便利だと理解しています。'Class.forName( "MY_JDBC_DRIVER")'の目的は何ですか?

しかし、私たちのプロジェクトでJDBCを使用している間、私たちはどのドライバを使用するのか知っています。ドライバマネージャの文字列はほとんどハードコードされています。

私の質問は、なぜここにClass.forName("JDBC_DRIVER")を使ってドライバをロードしていますか?
なぜクラスパスでドライバを追加できないのですか?どのドライバージャーが使用されるかを知っているからです。

Class.forName(JDBC_DRIVER)は、DriverManagerにドライバを読み込みます。唯一の理由ですか?

編集1:

DriverManager API doc状態

が(DriverManagerの)初期化の一部として、DriverManagerクラスは "jdbc.drivers" で参照されるドライバクラスをロードしようとすることシステムプロパティ。

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

次に、私はoracleドライバ以外を使用します。システムプロパティでドライバ名文字列を変更する必要はありますか?

+0

グループ、ありがとうございます。 class.forName()は、静的メソッドの呼び出しやそのクラスのインスタンスの作成など、他のメカニズムと比較してクラスを読み込むのに便利であることを理解しました。このようにして、ロード中に静的ブロックを使用して一度しか機能を実行できないようにすることができます。 –

答えて

22

最初のもの:最新のJDBCドライバと現在のJDK(少なくともJava 6)では、Class.forName()への呼び出しはもはや必要ありません。 service provider mechanismを使用してJDBC driver classes are now locatedであれば、そのコールを単に削除し、コードの残りの部分は変更しないでください。

現在のJDKを使用していない(あるいはあなたがは、そのメカニズムを使用するように設定適切なファイルを持っていませんJDBCドライバーを持っている場合)、ドライバはregisterDriverを使用してDriverManagerに登録する必要がある場合。そのメソッドはで、通常です。クラスが最初にロードされたときにトリガーされる実際のドライバークラスの静的イニシャライザーブロックから呼び出されます。Class.forName()を発行すると、ドライバーが確実に登録されます。

そして、どんなにあなたがClass.forName()たり、新しいサービスプロバイダのメカニズムを使用している場合、あなたは常には(少なくとも、実行時にいくつかのClassLoaderを介して、または利用可能)JDBCクラスパス上のドライバが必要になります。

TL; DRは:はい、そのClass.forName()コールののみ使用は、ドライバが登録されていることを確認することです。現在のJDKと現在のJDBCドライバを使用する場合、この呼び出しはもはや必要ではありません。

+1

はい! Class.forName()行がないjava6では、 DriverManagerは、oracleドライバ用のConnectionを作成することができます。私はちょうどテストした。これはloadInitialDrivers():: DriverManagerによって行われます。ありがとう! –

+0

@Joachim、JustinKのコメントhttp://stackoverflow.com/questions/8053095/what-is-the-actual-use-of-class-fornameoracle-jdbc-driver-oracledriver-while#comment-9863309によると、pre JDBC 4、 'Class.forName'は**ドライバがクラスパス上にない場合にのみ必要です。 JustinKのコメントは、「常にクラスパス上にJDBCドライバが必要です」というあなたの見解に直接矛盾しているのはなぜですか? – Pacerier

+0

@Pacerier:JustinKはクラスパス*上にドライバを持つことについて話しています*あなたのコードを構築中*。ドライバクラスに直接アクセスしない限り(これは非標準の機能にアクセスする必要があるかもしれませんが、そうでない場合はそうではありません)、必要ではありません。実行時には、クラスパス上にドライバを置く必要があります(もしそうであればカスタムクラスローダ上にあるかもしれませんが、それはかなり効果的です)。どうやってそれにアクセスしてもドライバをロードすることはできません。 –

12

のようなあなたがurlでそれに対処できるよう、DriverManagerの中であなたのJDBCドライバを登録しますClass.forNameの(JDBC_DRIVER)呼び出し、「JDBC:ODBC:データベース」ようにと...通常

あなたはまだクラスパスにJDBCドライバのjarファイルを配置する必要があり

public class Driver implements java.sql.Driver { 
    static { 
    try { 
     DriverManager.registerDriver(new Driver()); 
    } catch (SQLException E) { 
     throw new RuntimeException("Can't register driver!"); 
    } 
    } 
} 

:ドライバー・クラスがClass.forNameの()に呼び出され、このような静的初期化コードを、持っています。

また、データベース固有のDataSourceを使用できます。次に、SpringのコンテキストやWebサーバーのJNDIなどのデータソース型を宣言的に指定できます。ここにはexampleがあります。

+2

これは技術的には、Classがロードされたときに呼び出されます。必ずしも 'Class.forName()'ではなく、アンロードされたクラスを強制的に読み込む1つの方法です。 –

4

クラスパスにクラスを配置するだけでは、クラスローダーによってクラスをロードするには不十分です。ドライバクラスは、JDBC APIに登録されていることを確認するためにロードする必要があります。ところで、Class.forNameが動作するためには、ドライバクラスがクラスパスになければなりません。

2

多くの産業アプリケーションでは、このような情報をプロパティファイル/設定ファイルの形式で取り出すことによって、残りのコードからデータアクセスレイヤを抽象化したいと考えています。そのような場合、あなたがしたように何かを使う必要があるかもしれません。

JDBCインタフェースクラスを使用してデータベースにアクセスするためのコードを記述することができます。ここでは、データベースとして使用するテクノロジ(ojdbcドライバやmysql jdbcドライバなど)を選択してプロパティを設定できます。そのようなメソッドを使用してクラスをロードできます。

関連する問題