带有 TransactionTemplate 和 Connection Pool 的 JDBCTemplate,使用哪个数据源
Posted
技术标签:
【中文标题】带有 TransactionTemplate 和 Connection Pool 的 JDBCTemplate,使用哪个数据源【英文标题】:JDBCTemplate with TransactionTemplate and Connection Pool, which datasource to use 【发布时间】:2011-08-28 11:53:53 【问题描述】:我不太确定如何提出这个问题,所以请随时告诉我我的想法完全错误。
我想使用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 可以使用他们想要的任何连接。我的代码是否正确/保存?
【问题讨论】:
【参考方案1】:这应该没问题。关键部分是 JdbcTemplate
和 DataSourceTransactionManager
提供了相同的 DataSource
对象,您已经这样做了。
此代码是否保证在 doInTransaction 中完成的所有操作都对所有 jdbc 调用使用相同的连接?连接是否以某种方式在内部链接,因为看起来 JdbcTemplate 和 TransactionTemplate 可以使用他们想要的每个连接。
在内部,Spring 使用复杂的事务同步逻辑来确保事务、连接和数据源都正确同步(如果您有兴趣,请查看TransactionSynchronizationManager
,尽管要注意,这很可怕)。
只要您通过TransactionTemplate
和JdbcTemplate
API 进行操作,它就可以运行,无需您付出任何努力。但是,如果您自己开始手动从 DataSource
获取连接,那么所有的赌注都没有了。
【讨论】:
以上是关于带有 TransactionTemplate 和 Connection Pool 的 JDBCTemplate,使用哪个数据源的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring TransactionTemplate 取消当前事务
spring事务 TransactionTemplate 怎样实现多次提交
spring事务管理PlatformTransactionManager及transactionTemplate