1. 序章

JDBCは、 Java DatabaseConnectivityのコントラクトのAPIおよびSPI部分を定義する一連の仕様です。 この標準では、JDBCドライバーの抽象化を、データベースと対話するための主要なエントリポイントとして定義しています。

このチュートリアルでは、JDBCドライバーをロードするために必要ないくつかの基本的な手順を見ていきます。

2. JDBCドライバー

データベースに接続するには、JDBCドライバーのインスタンスを取得する必要があります。

JDBC URL接続文字列を指定することにより、DriverManagerから取得できます。 このようなURLには、データベースエンジンのタイプ、データベース名、ホスト名、ポート、およびデータベースベンダーに固有の他の接続パラメーターが含まれます。

接続文字列を使用して、JDBCのデータベースとの通信の基本単位であるデータベース接続オブジェクトを取得できます。

Connection con = DriverManager.getConnection(
   "jdbc:postgresql://localhost:21500/test?user=fred&password=secret&ssl=true");

指定されたURLのみが示されている場合、ドライバーマネージャーはどのドライバーを使用するかをどのように知るのですか?

クラスパスには多くのJDBCドライバーが存在する可能性があるため、各ドライバーを一意に区別する方法が必要です。

3. レガシーアプローチ

JDBCバージョン4およびJavaSE1.6より前は、サービスを自動的に検出して登録できるようにする汎用メカニズムはJVMにありませんでした。 そのため、JDBCドライバークラスを名前でロードするには、手動の手順が必要でした。

Class.forName("oracle.jdbc.driver.OracleDriver");

クラス読み込みプロセスは、ドライバインスタンスを DriverManager に登録し、このクラスをoraclepostgresなどのデータベースエンジン識別子に関連付ける静的初期化ルーチンをトリガーします。 。

登録が完了すると、JDBCURL内でこの識別子を[X86X]jdbc:oracleとして使用できます。

一般的なドライバー登録ルーチンは、ドライバーインスタンスをインスタンス化し、それをDriverManager.registerDriverメソッドに渡します。

public static void register() throws SQLException {
    if (isRegistered()) {
        throw new IllegalStateException("Driver is already registered. It can only be registered once.");
    } else {
        Driver registeredDriver = new Driver();
        DriverManager.registerDriver(registeredDriver);
        Driver.registeredDriver = registeredDriver;
    }
}

上記の例は、DriverManagerへのPostgresJDBCドライバーの登録を示しています。 これは、静的初期化子の一部としてJVMによってトリガーされます。

jdbc.drivers システムプロパティを設定することにより、従来のアプローチでもこのステップを部分的に自動化することができます。

java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver

このプロパティを指定すると、ドライバーマネージャーは指定されたJDBCドライバーのロードを自動的に試行します。

4. JDBC4アプローチ

自動サービス検出の問題は、Java1.6とサービスプロバイダーメカニズムで解決されました。 これにより、サービスプロバイダーは、サービスを含むJARファイル内の META-INF / services の下にサービスを配置することにより、サービスを宣言できます。

このメカニズムにより、ドライバーが自動的に登録されるため、クラスをロードするための手動の手順は不要になります。 ただし、サービスプロバイダーが配置されている場合でも、手動でクラスをロードしても失敗は発生しません。 最近のJVMおよびJDBC4ドライバーを使用してドライバーのロードを明示的に呼び出すことは完全に合法です。

サービスプロバイダーの仕様は、手動のクラスロードを宣言型アプローチに置き換えるだけです。 たとえば、PostgreSQL JDBCドライバーには、 META-INF / services/の下に単一のファイルがあります。 ファイル名はjava.sql.Driver(JDBCドライバーの定評のある規則です)です。 これには、JDBCドライバーの完全修飾クラス名(この場合は org.postgresql.Driver )が含まれています。

5. 結論

この記事では、JDBCに関する基本的な概念と、JDBCドライバーをロードするためのさまざまな方法を、それぞれのアプローチの説明とともに確認しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。