2011-08-28 4 views
5

を使用するには、データソース接続プール、。JDBCTemplate TransactionTemplateと、私は質問を策定するので、私はcompletly間違って考えていることを教えて気軽にするかどうかは非常にわからない

私はJdbcTemplateTransactionTemplateを使用します。接続プールをデータソースとして初期化し、トランザクションマネージャをデータソースとして作成することから始めますか?

 BoneCPConfig connectionPoolConfig = new BoneCPConfig(); 
    connectionPoolConfig.setJdbcUrl(...); 
    connectionPoolConfig.setUsername(...); 
    connectionPoolConfig.setPassword(...); 
    connectionPoolConfig.setMinConnectionsPerPartition(...); 
    connectionPoolConfig.setMaxConnectionsPerPartition(...); 
    dataSource = new BoneCPDataSource(connectionPoolConfig); 
    DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); 
    definition.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 
    DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(); 
    transactionManager.setDataSource(dataSource); 

しかし、今、私は私のTransactionTemplateとJdbcTemplate作成したい:

transactionTemplate = new TransactionTemplate(transactionManager); 
JdbcTemplate jdbc = new JdbcTemplate(transactionManager.getDataSource()); 

今mulitpleスレッドがtransactionTemplatejdbcにアクセスします。このコードは、doInTransactionで行われたすべてがすべてのjdbc呼び出しで同じ接続を使用することを保証しますか?

はJdbcTemplateとTransactionTemplateが今まで何の接続を使用することができれば、彼らが望んでいたように見えるため、接続が何らかの形で、内部的にリンクされています。私のコードは正しい/保存されていますか?

答えて

5

これは、すべて問題ないはずです。重要な部分はJdbcTemplateDataSourceTransactionManagerに同じDataSourceオブジェクトが付属していることです。

このコードは、doInTransactionで行われたすべてがすべてのjdbc呼び出しで同じ接続を使用することを保証しますか? JdbcTemplateとTransactionTemplateが望むすべての接続を使用できるかのように見えるため、接続は内部的に何らかの形でリンクされていますか?

は内部的には、春には、(もし興味があるなら、 TransactionSynchronizationManagerを見ているものの、それは恐ろしいです警告される)、トランザクション、接続とデータソースがすべて適切に同期されていることを確認するために、複雑なトランザクション同期ロジックを使用しています。

TransactionTemplateJdbcTemplate APIを使用している限り、あなたの努力なしに動作します。あなたが手動でDataSourceからの接続を手動で取得し始める場合は、すべてのベットはオフになります。

関連する問題