JDBCでConnectionを取得する2つの方法

3589 ワード

JDBCはJava Database Connectivityというフルネームで、Java公式定義の接続データベースの仕様です。中には各種APIが含まれています。一番重要なのはデータベース接続Connectionをどうやって取得するかについての方法です。
  • 直接Driver Manager類のget Connectionを呼び出す方法
  • は、DataSourceインターフェースを実現し、インスタンスのgetConnection方法
  • を起動する。
    Driver Manager
    初めてJDBCを勉強した時、各学生はまず以下のコードに接触します。手順は簡単です。まず該当データベースのJDBC Driverを登録して、JDBC DriverManagerを通じてデータベース接続を取得してから、接続からSQ文を実行します。
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection(DB_URL,USER,PASS);
    Statement stmt = conn.createStatement();
    String sql;
    sql = "SELECT id, first, last, age FROM Employees";
    ResultSet rs = stmt.executeQuery(sql);
    ...
    
    JDBC仕様では、Driver類は、ロード時にDriverManager類に自分のインスタンスを登録しなければならないと規定しています。例えば、MySQLで実現されるDriver類は、クラスローディング時にstaticコードブロックを実行し、DriverインスタンスをDriverManager類に登録し、DriverManager類は一つのCopyOWriteArryListを維持して登録されたDriverをすべてのDriverを保存します。
    
    package com.mysql.jdbc;
    
    import java.sql.SQLException;
    
    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        //
        // Register ourselves with the DriverManager
        //
        static {
            try {
                java.sql.DriverManager.registerDriver(new Driver());
            } catch (SQLException E) {
                throw new RuntimeException("Can't register driver!");
            }
        }
    
        public Driver() throws SQLException {
            // Required for Class.forName().newInstance()
        }
    }
    
    
    java.sql.Driverはインターフェースクラスであり、最も重要なのはconnect(String url, Properties info)方法であり、アプリケーションはDriverManagerのget Connection方法を呼び出すと、内部はすべてのDriverを通して転送されたURLを使ってデータベースに接続を試み、接続が成功してからConnectionの実施例に戻る。したがって、Driverはデータベース接続の真のクラスを取得し、各データベースメーカーはDriver.connect(String url, Properties info)内に自分の内部実現ロジックをカプセル化しました。例えば、MySQLはconnectメソッド内部でMySQLプロトコルを実現して、リモートMySQLサービスとTCP接続を確立します。
    DataSource
    JDBC仕様は、より柔軟にConnectionを取得する方法、すなわちDataSourceインターフェース、DataSourceインターフェースがget Connectionを実現する必要があるなどの方法を提供しています。このような方式はDriverManagerより抽象的であり、ユーザー自身がConnectionを取得する方式を実現することができ、アプリケーション層でも接続がどのように取得されたのかを知る必要がないので、実際のアプリケーションでは DataSource 、
    DataSource:Thisisisinterface is preferred over DriverManager because it allows details a about the undededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededededididididididididididididididididididididididididididididistastastastastastastastastastastastastastastastastastastastastastastastastastastastastastastaveloping aplications with the DataSource class、see the latest The Java EE Tutorial.
    DataSourceがありますが、データベースメーカーは上記のDriverを提供します。Driverを通じてデータベースを接続する方式は物理層接続であり、必要不可欠です。すべてのDataSourceの一番下の階に物理接続を確立する方式はやはりDriver類を通して操作します。有名なデータベース接続池DruidAbstractDataSourceのcreatePhysicalConnection方法。
    //MysqlDataSource.java
    mysqlDriver.connect(jdbcUrlToUse, props);
    
    // DruidAbstractDataSource.java
    public Connection createPhysicalConnection(String url, Properties info) throws SQLException {
        Connection conn;
        if (getProxyFilters().size() == 0) {
            conn = getDriver().connect(url, info);
        } else {
            conn = new FilterChainImpl(this).connection_connect(info);
        }
    
        createCount.incrementAndGet();
    
        return conn;
    }
    
    参考資料
    https://docs.oracle.com/javase/tutorial/jdbc/basics/index.html https://docs.oracle.com/javase/7/docs/api/index.html?java/sql/DriverManager.html https://dev.mysql.com/doc/connector-j/6.0/en/connector-j-usagenotes-basic.html