データベースに接続するときのClass.forName(“ oracle.jdbc.driver.OracleDriver”)の実際の使用は何ですか?


91

コマンドは何でしょう

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

Oracleデータベースに接続しているときに正確に実行しますか?同じことをする別の方法はありますか?


6
関連:stackoverflow.com/questions/5992126/loading-jdbc-driverアプリケーションの起動時に一度だけ呼び出す必要があることに注意してください。アプリケーションの存続期間中に接続を取得する前に、毎回それを呼び出す必要はありません。
BalusC 2011年

@BalusC私は、クラスコンストラクターでA呼び出す別のクラスに接続の詳細があり、接続が必要な各サーブレットの接続フィールドを取得するオブジェクトを作成すると、Javaはスキップされるか、再度ロードされますか?Class.forName("oracle.jdbc.driver.OracleDriver")AA'sClass.forName("oracle.jdbc.driver.OracleDriver")
Asif Mushtaq 2015年

回答:


68

FQCN(完全修飾クラス名)を持つクラスオブジェクトへの参照を取得しますoracle.jdbc.driver.OracleDriver

指定されたクラスが現在のクラスローダーによって確実にロードされることを除けば、データベースへの接続に関しては何も「行いません」。書くことの間に基本的な違いはありません

Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");

Class.forName("com.example.some.jdbc.driver")呼び出しは、JDBCドライバーをロードする従来の方法であるため JDBCを使用する従来のコードに表示されます

Javaチュートリアルから:

以前のバージョンのJDBCでは、接続を取得するには、まずメソッドを呼び出してJDBCドライバーを初期化する必要がありましたClass.forName。このメソッドには、タイプのオブジェクトが必要でしたjava.sql.Driver。各JDBCドライバーには、インターフェースを実装する1つ以上のクラスが含まれていますjava.sql.Driver
...
クラスパスにあるJDBC 4.0ドライバーはすべて自動的にロードされます。(ただし、メソッドを使用して、JDBC 4.0より前のドライバーを手動でロードする必要がありますClass.forName。)

さらに読む(読んで:これはdupの質問です)


29
つまり、クラスを明示的にインポートしなくてもDriverクラスを使用できます。これにより、クラスパスにOracleドライバーがなくてもプロジェクトをビルドできます。
JustinKSU

3
ただし、「レガシー方式」ではClass.forName()、返されたdriverClassへの参照をキャプチャせずに呼び出すため、一見すると何もしない操作のように見えます
matt b

11
これは、JDBCドライバーに、ドライバーをDriverManagerに登録する静的初期化子が必要なためです。Class.forName()を使用すると、この初期化子が実行され、ドライバが登録されます。JDBC 4.0以降、DriverManager自体はServiceLoaderを使用してクラスパス上のドライバーを検索します。
Mark Rotteveel、2011年

1
@ MattBall、JDBC 4.0より前では、ドライバーへの参照を取得するか、そのドライバークラスの静的関数を呼び出すと、既にドライバークラスが自動ロードされていました。では、なぜ手動で行う必要があるのClass.forName("etc.driver")でしょうか。
Pacerier 2014

1
@Pacerierの誤った仮定。JDBCはロードするドライバを認識していません。そのため、ドライバクラスを参照することを認識しているJDBC(ドライバに依存しない)には何もありません。したがって、クラスのロードをトリガーするものが必要です。静的メソッドがの代わりに機能すると思いますClass.forName(...)
マットボール

13

ドライバーを登録します。フォームの何か:

public class SomeDriver implements Driver {
  static {
    try {
      DriverManager.registerDriver(new SomeDriver());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
    }
  }

  //etc: implemented methods
}

6

JavaのJDBCチュートリアル

以前のバージョンのJDBCでは、接続を取得するには、まずメソッドを呼び出してJDBCドライバーを初期化する必要がありましたClass.forName。クラスパスにあるJDBC 4.0ドライバーはすべて自動的にロードされます。(ただし、メソッドを使用して、JDBC 4.0より前のドライバーを手動でロードする必要がありますClass.forName。)

したがって、Java 11でOracle 11g(11.1)ドライバーを使用している場合は、を呼び出す必要はありませんClass.forName。それ以外の場合は、それを呼び出してドライバーを初期化する必要があります。


1
@Jonathan「JDBC 4.0より前のメソッドをClass.forNameで手動でロードする」とはどういう意味ですか?
Aravind

このClass.forName呼び出しにより、クラスローダーは指定されたクラスを強制的にロードします。これは、チュートリアルで説明されている手動の読み込み手順です。
ジョナサン

@Jonathanだからこそ、私の接続はまだなくても機能していますclass.forName();:)
Asif Mushtaq

2

Java 6より前のDriverManagerクラスでは、どのJDBCドライバーを使用したいかがわかりませんでした。Class.forName("...")ドライバークラスをプリロードする方法でした。

Java 6を使用している場合、これを行う必要はありません。


はい、使用する必要があります。OracleDataSourceがdocs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726になり、URLが独自に作成されます。final OracleDataSource ds = new OracleDataSource(); ds.setDriverType( "thin"); ds.setServerName(hostName); ds.setPortNumber(port); //ds.setDatabaseName(dbName); ds.setServiceName(dbName); connection = ds.getConnection(user、pwd);
Rajesh Goel

1

このコマンドは、Oracle jdbcドライバーのクラスをロードして、DriverManagerインスタンスで使用できるようにします。クラスがロードされると、システムはそれを使用してOracleに接続できます。別の方法として、DriverManagerのregisterDriverメソッドを使用して、必要なJDBCドライバーのインスタンスと一緒に渡すことができます。



0

oracle.jdbc.driver.OracleDriverではなく、oracle.jdbc.OracleDriverを使用してください。Tomcatを使用している場合、ドライバjarファイルが「WEB-INF \ lib」ディレクトリにある場合は、登録する必要はありません。これをtest.jspとして保存し、Webディレクトリに配置して、WebアプリケーションフォルダーをTomcatマネージャーに再デプロイします。

<%@ page import="java.sql.*" %>

<HTML>
<HEAD>
<TITLE>Simple JSP Oracle Test</TITLE>
</HEAD><BODY>
<%
Connection conn = null;
try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:XXXX:dbName", "user", "password");
    Statement stmt = conn.createStatement();
    out.println("Connection established!");
}
catch (Exception ex)
{
    out.println("Exception: " + ex.getMessage() + "");

}
finally
{
    if (conn != null) {
        try {
            conn.close();   
        }
        catch (Exception ignored) {
            // ignore
        }
    }
}

%>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.