7

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

我想使用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 可以使用他们想要的任何连接。我的代码是否正确/保存?

4

1 回答 1

6

这应该没问题。关键部分是JdbcTemplateDataSourceTransactionManager提供了相同的DataSource对象,您已经完成了。

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

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

只要您通过TransactionTemplateJdbcTemplateAPI 进行操作,它就可以在您不付出任何努力的情况下工作。但是,如果您开始手动从DataSource自己那里获取连接,那么所有的赌注都没有了。

于 2011-08-28T12:00:00.680 回答