4

単純な JDBC 接続を実行している間、すべてのリソースが同じコードを提供します。

String driver = "com.mysql.jdbc.Driver";
Statement statement = null; 
Class.forName(driver); 
Connection conn  = DriverManager.getConnection(url + dbName,userName, password);

しかし、「Class.forName(driver)」は実際には何もしません。どこにも保管していません。Class.forName(driver) の戻り値とは関係がないため、その用途は何ですか。

4

6 に答える 6

6

Class.forName()名前付きクラスのロードを試みます。JDBC の初期のバージョンではDriver、この方法でクラスをロードする必要があったため、これが必要でした。これは何年もの間必要ではありませんでした。

電話を切っても、悪いことは何も起こりません。

何らかの理由で、チュートリアルと例は古い方法のままです。

クラスを手動でロードすることの唯一の小さな利点は、クラスパスに適切なクラスがない場合に問題が何であるかを正確に教えてくれることです。

于 2013-08-05T13:06:20.667 に答える
3

これは、自身を DriverManager に登録する com.mysql.jdbc.Driver の一部です。

//
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

バージョン 1.6 以降、Class.forName() を使用して JDBC ドライバーを明示的にロードする必要がないため、DriverManager はサービス プロバイダー メカニズムを使用して JDBC 4.0 ドライバーを自動的に検出できることに注意してください。JDBC ドライバーのクラス名は、META-INF/services/java.sql.Driver ファイルに書き込まれます。

于 2013-08-05T13:11:17.390 に答える
1

class.forName() により、ClassLoader はクラスをメモリにロードします。JDBC ドライバー クラスには、後で参照できるようにドライバーを DriverManager に登録する静的初期化ブロックが含まれています。接続すると、DriverManager はデータベース パラメータを使用して適切なドライバを検索します。

于 2013-08-05T13:05:56.063 に答える
0

Class.forName("driver.class");指定された JDBC ドライバーをロードします。ドライバーが読み込まれると、それ自体もDriverManager. したがって、呼び出すと、以前にロードされたドライバーを介してDriverManager#getConnection()確立できます。Connection

DriverManager#getConnection()

メソッド getConnection が呼び出されると、DriverManager は、初期化時にロードされたドライバーと、現在のアプレットまたはアプリケーションと同じクラスローダーを使用して明示的にロードされたドライバーの中から適切なドライバーを見つけようとします。

于 2013-08-05T13:01:44.633 に答える
0

を使用Class.forName(..)すると、クラスがロードされます。ほとんどのjava.sql.Driver実装 (静的イニシャライザを使用)java.sql.DriverManagerは、クラスがロードされるときに自身を実装に登録します。詳細については、JDBC 4.1 仕様のセクション 9.2 を参照してください。

JDBC ドライバーはDriverインターフェースを実装する必要があり、その実装には、ドライバーのロード時に呼び出される静的初期化子が含まれている必要があります。このイニシャライザは、それ自体の新しいインスタンスをDriverManager,

登録後、そのドライバーを使用して接続を作成できます。

ただし、JDBC 4.0 (Java 6) 以降では、JDBC 4.0 仕様に準拠したドライバーをこの方法でロードする必要がなくなりました。メカニズムDriverManagerを使用して JDBC ドライバーの検索とロードを処理するためです。ServiceLoaderJDBC 4.1 仕様のセクション 9.2.1 を参照してください。

このDriverManager.getConnectionメソッドは、Java Standard Edition Service Provider メカニズムをサポートするように拡張されました。JDBC 4.0 ドライバーには、ファイルが含まれている必要がありますMETA-INF/services/java.sql.Driver。このファイルには、JDBC ドライバーの実装の名前が含まれていますjava.sql.Driver

于 2013-08-05T13:02:03.157 に答える
0

1 つの副作用があります。文字列名で指定されたドライバをメモリにロードします。

Java では、クラスは実際に使用する必要がある場合にのみロードされます。

そのClass.forName()ため、クラスローダーがバイトコードを「読み取り」、クラス定義を JVM のメモリにロードします。

これが発生すると、このクラスの静的初期化ブロック (およびドライバーが持つ必要があります) が実行されます (このクラスのオブジェクトを実際に作成しないため、静的にする必要があります)。

この静的初期化ブロックは、DriverManager にドライバーを登録するように記述されています。

これは「本による」説明です。もちろん、この API はそれほど明確ではなく、自明ではありません。これを明示的に行うことは可能です:

Driver driver = (Driver)Class.forName("com.mysql.jdbc.Drivercom.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);

Java 6 以降、このメカニズムは使用しないでください。ドライバーをロードする新しい方法については、こちらをお読みください。

お役に立てれば

于 2013-08-05T13:03:05.530 に答える