ホームページ  >  記事  >  Java  >  DataSourceUitls の概要とメソッド

DataSourceUitls の概要とメソッド

零下一度
零下一度オリジナル
2017-07-26 17:01:351795ブラウズ

DataSourceUitls の概要

DataSourceUitls クラスは org.springframework.jdbc.datasource パッケージの下にあり、javax.sql.DataSource から JDBC 接続を取得するための多くの静的メソッドを提供し、Spring トランザクション管理のサポートを提供します。

JdbcTemplate クラス内で、DataSourceUtils が複数回使用されます。実際、コード内で直接 DataSourceUitls を使用して Jdbc を操作することもできます。

DataSourceUitlsがConnectionを取得

getConnectionメソッド

内部実装

    public static Connection getConnection(DataSource dataSource) throws CannotGetJdbcConnectionException {
        try {
            return doGetConnection(dataSource);
        }
        catch (SQLException ex) {
            throw new CannotGetJdbcConnectionException("Failed to obtain JDBC Connection", ex);
        }
        catch (IllegalStateException ex) {
            throw new CannotGetJdbcConnectionException("Failed to obtain JDBC Connection: " + ex.getMessage());
        }
    }

指定したDataSourceを渡すことでConnectionを取得でき、doGetConnectionメソッドで取得処理が実装されていることがわかります。 SQLException と IllegalStateException がスローされる場合は、それらを CannotGetJdbcConnectionException にラップします。実際には、SQLException と IllegalStateException のみがスローされます。 CannotGetJdbcConnectionException のソース コードを見ると、CannotGetJdbcConnectionException は実際には DataAccessException のサブクラスであることがわかります。したがって、getConnection はスローされた例外を Spring の DataAccessException に均一にカプセル化すると言えます。

doGetConnectionメソッド

内部実装

    public static Connection doGetConnection(DataSource dataSource) throws SQLException {
        Assert.notNull(dataSource, "No DataSource specified");

        ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
        if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) {
            conHolder.requested();
            if (!conHolder.hasConnection()) {
                logger.debug("Fetching resumed JDBC Connection from DataSource");
                conHolder.setConnection(fetchConnection(dataSource));
            }
            return conHolder.getConnection();
        }
        // Else we either got no holder or an empty thread-bound holder here.

        logger.debug("Fetching JDBC Connection from DataSource");
        Connection con = fetchConnection(dataSource);

        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            logger.debug("Registering transaction synchronization for JDBC Connection");
            // Use same Connection for further JDBC actions within the transaction.
            // Thread-bound object will get removed by synchronization at transaction completion.
            ConnectionHolder holderToUse = conHolder;
            if (holderToUse == null) {
                holderToUse = new ConnectionHolder(con);
            }
            else {
                holderToUse.setConnection(con);
            }
            holderToUse.requested();
            TransactionSynchronizationManager.registerSynchronization(
                    new ConnectionSynchronization(holderToUse, dataSource));
            holderToUse.setSynchronizedWithTransaction(true);
            if (holderToUse != conHolder) {
                TransactionSynchronizationManager.bindResource(dataSource, holderToUse);
            }
        }

        return con;
    }

doGetConnectionメソッドは、実際にConnectionを取得するために使用されるコアメソッドです。ソース コードから、現在のスレッドにバインドされた Connection がない場合、新しい Connection が作成されると結論付けることができます。現在のスレッドのトランザクション同期がアクティブであれば、新しく作成された Connection に Spring トランザクション管理サポートが追加されます。 Connection; if 現在のスレッドに対応する接続​​が存在する場合、現在のトランザクション管理割り当てが存在します。

fetchConnection メソッド

fetchConnection は、一般には公開されていないプライベート メソッドです。実際には、現在の DastaSource から新しい Connection を作成するという単純な機能を実行します。作成が失敗した場合は、新しい Connection が作成されたことを示します。入手できません。

DataSourceUitls は Connection をリリースします

releaseConnection メソッド

内部実装

    public static void releaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) {
        try {
            doReleaseConnection(con, dataSource);
        }
        catch (SQLException ex) {
            logger.debug("Could not close JDBC Connection", ex);
        }
        catch (Throwable ex) {
            logger.debug("Unexpected exception on closing JDBC Connection", ex);
        }
    }

releaseConnection メソッドの特定の実装は doReleaseConnection によって処理されます。例外がスローされた場合、その例外はログ内でデバッグされるだけであり、外部にはスローされません。このメソッドのパラメータは両方とも NULL です。 con が NULL の場合、この呼び出しは無視されますが、他のパラメータは NULL であっても構いません。

doReleaseConnection メソッド

内部実装

    public static void doReleaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) throws SQLException {
        if (con == null) {
            return;
        }
        if (dataSource != null) {
            ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
            if (conHolder != null && connectionEquals(conHolder, con)) {
                // It's the transactional Connection: Don't close it.
                conHolder.released();
                return;
            }
        }
        logger.debug("Returning JDBC Connection to DataSource");
        doCloseConnection(con, dataSource);
    }

doReleaseConnection メソッドは、実際に Connection を解放するメソッドです。 releaseConnection メソッドと比較して、渡された 2 つのパラメーターのチェックサムを完了し、下位レベルの例外をスローします。 dataSource が NULL でない場合、この ConnectionHolder によって保持されている現在の接続を解放すると、現在の Connection が再利用できるようになります。これは、Jdbc 操作のパフォーマンスを向上させるのに非常に役立ちます。 dataSource が null の場合は、接続を直接閉じることを選択します。

DataSourceUitlsがConnectionを閉じる

doCloseConnectionメソッド

内部実装

    public static void doCloseConnection(Connection con, @Nullable DataSource dataSource) throws SQLException {
        if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) {
            con.close();
        }
    }

doReleaseConnectionメソッドでは、データソースがNULLの場合にdoCloseConnectionメソッドが実行されることが分かりました。実際、dataSource が org.springframework.jdbc.datasource.SmartDataSource インターフェイスを実装していない場合、または dataSource が org.springframework.jdbc.datasource.SmartDataSource インターフェイスを実装し、閉じることが許可されている場合にのみ、Connection は実際に閉じられます。

org.springframework.jdbc.datasource.SmartDataSource インターフェースは javax.sql.DataSource インターフェースの拡張であり、ラップされていない形式で Jdbc 接続を返します。このインターフェイスを実装するクラスは、操作の完了後に接続を閉じる必要があるかどうかをクエリできます。このようなチェックは、Srping、DataSourceUitls、および JdbcTemplate で自動的に実行されます。

以上がDataSourceUitls の概要とメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。