ホームページ >Java >&#&チュートリアル >DataSourceUitls の概要とメソッド
DataSourceUitls クラスは org.springframework.jdbc.datasource パッケージの下にあり、javax.sql.DataSource から JDBC 接続を取得するための多くの静的メソッドを提供し、Spring トランザクション管理のサポートを提供します。
JdbcTemplate クラス内で、DataSourceUtils が複数回使用されます。実際、コード内で直接 DataSourceUitls を使用して Jdbc を操作することもできます。
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 に均一にカプセル化すると言えます。
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 は、一般には公開されていないプライベート メソッドです。実際には、現在の DastaSource から新しい Connection を作成するという単純な機能を実行します。作成が失敗した場合は、新しい Connection が作成されたことを示します。入手できません。
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 であっても構いません。
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); }
public static void doCloseConnection(Connection con, @Nullable DataSource dataSource) throws SQLException { if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) { con.close(); } }
org.springframework.jdbc.datasource.SmartDataSource インターフェースは javax.sql.DataSource インターフェースの拡張であり、ラップされていない形式で Jdbc 接続を返します。このインターフェイスを実装するクラスは、操作の完了後に接続を閉じる必要があるかどうかをクエリできます。このようなチェックは、Srping、DataSourceUitls、および JdbcTemplate で自動的に実行されます。
以上がDataSourceUitls の概要とメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。