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



我不太确定如何表述这个问题,所以请告诉我我完全想错了。

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

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

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

在内部,Spring使用复杂的事务同步逻辑来确保事务、连接和数据源都是正确同步的(如果您感兴趣,请查看TransactionSynchronizationManager,尽管要注意,它很可怕)。

只要你通过TransactionTemplateJdbcTemplate api操作,它就会工作,而不需要你付出任何努力。但是,如果您开始自己手动从DataSource获取连接,那么所有的赌注都将取消。

相关内容

  • 没有找到相关文章

最新更新