带有TransactionTemplate和Connection Pool的JDBCTemplate,要使用哪个数据源

时间:2011-08-28 11:53:53

标签: database spring jdbc jdbctemplate transactionmanager

我不太确定如何制定这个问题,所以请随时告诉我,我在想完全错误。

我想使用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());

现在多个线程可以访问transactionTemplatejdbc。此代码是否保证doInTransaction中完成的所有内容都对所有jdbc调用使用相同的连接?

连接是否以某种方式在内部链接,因为它看起来好像JdbcTemplate和TransactionTemplate可以使用他们想要的连接。我的代码是否正确/保存?

1 个答案:

答案 0 :(得分:6)

这一切都应该没问题。关键部分是JdbcTemplateDataSourceTransactionManager提供了相同的DataSource对象,您已完成此操作。

  

此代码是否保证doInTransaction中的所有内容都对所有jdbc调用使用相同的连接?连接是否以某种方式在内部链接,因为它看起来好像JdbcTemplate和TransactionTemplate可以使用他们想要的每个连接。

在内部,Spring使用复杂的事务同步逻辑来确保事务,连接和数据源都已正确同步(如果您有兴趣,请查看TransactionSynchronizationManager,尽管会被警告,但这很可怕)。

只要您通过TransactionTemplateJdbcTemplate API进行操作,您就可以毫不费力地工作。但是,如果您自己开始手动从DataSource获取连接,则所有投注均已关闭。