【问题标题】:Spring Transaction (@Transaction) with Plain JDBC without JdbcTemplateSpring Transaction (@Transaction) with Plain JDBC without JdbcTemplate
【发布时间】:2021-11-29 14:02:04
【问题描述】:

我有纯 JDBC 代码,它使用连接接口进行事务管理。我想逐步切换到 Spring 事务管理。

首先我想为我的数据源提供PlatformTransactionManager 并用@Transaction 注释我的类/方法并保持我的其他逻辑相同,即。使用连接/PreparedStatement 等。

我看到的所有示例都使用 JdbcTemplate。我想知道没有 JdbcTemplate 可以使用 Spring Transaction 吗?

【问题讨论】:

  • 为什么?只需发出 SQL 事务语句。
  • @K.Nicholas:我的问题是我仍然不想更改看起来像这样的代码:try (PreparedStatement pstmt = ....createPreparedStatement(connection); ResultSet result = pstmt.executeQuery()) 我只想使用 @Transaction 注释将事务处理转移到 Spring Transaction,这样我就不必处理显式回滚或提交事务等。
  • 自带 JDBC 对吧。
  • @K.Nicholas:纯 JDBC 太冗长了。我想最终使用 Spring Transaction / JPA 等...我想采取一些小步骤,例如首先使用 Spring 事务更改事务管理,然后可能是使用 jdbcTemplate,然后是 JPA 等。
  • 别打扰,只是浪费时间。

标签: java spring jdbc jdbctemplate spring-transactions


【解决方案1】:

是的,这是可能的。在您的方法中添加@Transactional 注释,as long as they follow the correct procedure 应该使您的方法具有事务性。但正如其他人所提到的,如果您正在更新您的应用程序,您不妨放弃普通的 JDBC 并改用 Spring JPA/JDBC(取决于您使用的 Spring 版本)。

【讨论】:

    【解决方案2】:

    从技术上讲,可以使用 @Transactional 而不使用 JdbcTemplate 。但是如果你尝试去做,你迟早会发现你正在重新发明JdbcTemplate已经做过的事情。

    @Transactional 的作用是在执行@Transactional 方法之前,它会帮助你从DataSource 获取一个JDBC Connection,并在这个Connection 上启动一个事务。JDBC Connection然后将存储在ThreadLocal。

    这意味着如果您在没有 JdbcTemplate 的情况下执行此操作,则必须从该 ThreadLocal 手动获取此 Connection 以便您可以从中创建一个 JDBC Statement 以执行您的 SQL。更不用说你必须自己手动释放Statement,ResultSet等JDBC资源,所有这些事情都已经由JdbcTemplate处理了。

    但如果你已经手动实现了这些 JDBC 代码,只是想让@Transactional 处理事务,你可以尝试将DataSource 注入到你的bean 中,然后使用以下方法获取Connection为您的 JDBC 代码使用:

        Connection connection = DataSourceUtils.getConnection(dataSource);
    

    另外检查 JdbcTemplate#execute(ConnectionCallback<T> action) ,它对于将期望 JDBC Connection 工作的现有 JDBC 代码迁移到 JdbcTemplate 很有用。

    【讨论】:

    • 谢谢!我还有一个问题....我可以将我的数据源包装在 TransactionAwareDataSourceProxy instrad 中以从 DataSourceUtils 获取连接吗?
    • 应该可以作为TransactionAwareDataSourceProxy,因为它也是DataSource的类型。
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2016-07-07
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多