2012-03-10 19 views

答えて

13

重要な違いが1つあります。dataSource.getConnection()は、常にdataSourceまたは接続プールから取得した新しい接続を返します。 DataSourceUtils.getConnection()は、現在のスレッドのアクティブなトランザクションがあるかどうかをチェックします。存在する場合、このトランザクションとの接続を返します。存在しない場合は、dataSource.getConnection()と全く同じように動作します。

DataSourceUtils.getConnection()を使用する場合は注意が必要です。アクティブなトランザクションの接続が返された場合、誰かがそのトランザクションをオープンした人の責任であるため、他の誰かがクローズすることを意味します。一方、データソースから新しい接続を返す場合は、コミット/ロールバック/クローズする必要があります。

+1

トランザクションを実行していて、 'dataSource.getConnection()'によって接続が取得された場合、その接続は現在のトランザクションにバインドされませんか? –

+1

@mishanesterenkoいいえ、dataSource.getConnection()は、データベースから直接、またはアクティブなトランザクションのないプールから、常に新しい接続を返します。 – mrembisz

+1

'DataSourceUtils.releaseConnection()'のjavadocから、「与えられたDataSourceから取得したConnectionを、外部(つまりスレッドにバインドされていない)で管理していない場合、Closeします。これは、(DataSourceUtils.getConnection()から取得した)接続を使用した後にこのメソッドを呼び出すことは常に安全であり、接続が実際のトランザクションに参加したかどうかについての知識は必要ありません。 –

2

DataSourceUtils#getConnection()なぜそれを使用したいのかを明確に文書化しています。特に、生のSQL例外とは異なりSpring JDBC例外階層を使用し、Springのトランザクション管理機能に参加します。これら2つの機能のいずれかが必要ない場合は、DataSource#getConnection()を使用してコードを取得してください。

+1

トランザクションを実行していて、 'dataSource.getConnection()'によって接続が取得された場合、その接続は現在のトランザクションにバインドされませんか? –

関連する問題