7

質問の仕方がよくわからないので、私の考えが完全に間違っていることを教えてください。

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

        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());

複数のスレッドがアクセスtransactionTemplateし、jdbc. doInTransactionこのコードは、すべての jdbc 呼び出しで同じ接続を使用することを保証しますか?

JdbcTemplate と TransactionTemplate が必要な接続を使用できるように見えるため、接続は何らかの方法で内部的にリンクされていますか。私のコードは正しいですか?

4

1 に答える 1

6

これはすべて問題ないはずです。重要な部分はそれJdbcTemplateであり、あなたが行っDataSourceTransactionManagerたのと同じDataSourceオブジェクトが提供されます。

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

内部的には、Springは複雑なトランザクション同期ロジックを使用して、トランザクション、接続、およびデータソースがすべて適切に同期されていることを確認します(興味がある場合はTransactionSynchronizationManager、警告されますが、恐ろしいことを確認してください)。

TransactionTemplateとAPIを介して操作する限り、JdbcTemplate何の努力もせずに機能します。ただし、自分から手動で接続を取得し始めるDataSourceと、すべての賭けが無効になります。

于 2011-08-28T12:00:00.680 に答える