加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JOOQ和交易

发布时间:2020-12-14 05:03:48 所属栏目:Java 来源:网络整理
导读:我一直在读约 transactions jooq,但我很难看到如何在实践中实现它. 假设我向JOOQ提供了一个自定义的ConnectionProvider,它恰好将一个连接池与autocommit设置为false. 实施大致如下: @Override public Connection acquire() throws DataAccessException { re
我一直在读约 transactions & jooq,但我很难看到如何在实践中实现它.

假设我向JOOQ提供了一个自定义的ConnectionProvider,它恰好将一个连接池与autocommit设置为false.

实施大致如下:

@Override public Connection acquire() throws DataAccessException {
    return pool.getConnection();
}

@Override public void release(Connection connection) throws DataAccessException {
    connection.commit();
    connection.close();
}

我将如何将两个jooq查询包装到单个事务中?

DefaultConnectionProvider很容易,因为只有一个连接 – 但是有一个池我不知道该怎么做.

解决方法

jOOQ 3.4 Transaction API

使用jOOQ 3.4,已经添加了一个transaction API,用于对JDBC,Spring或JTA事务管理器进行抽象.此API可以与Java 8一起使用:

DSL.using(configuration)
   .transaction(ctx -> {
       DSL.using(ctx)
          .update(TABLE)
          .set(TABLE.COL,newValue)
          .where(...)
          .execute();
   });

或者使用Java 8之前的语法

DSL.using(configuration)
   .transaction(new TransactionRunnable() {
       @Override
       public void run(Configuration ctx) {
           DSL.using(ctx)
              .update(TABLE)
              .set(TABLE.COL,newValue)
              .where(...)
              .execute();
       }
   });

这个想法是,lambda表达式(或匿名类)形成事务代码,其中:

>正常完成时提交
>例外情况下回滚

org.jooq.TransactionProvider SPI可用于覆盖默认行为,该行为通过使用Savepoints的JDBC实现可嵌套事务.

一个春天的例子

当前的文档显示了使用Spring进行事务处理的一个例子:

> http://www.jooq.org/doc/latest/manual/getting-started/tutorials/jooq-with-spring/

这个例子基本上归结为使用Spring TransactionAwareDataSourceProxy

<!-- Using Apache DBCP as a connection pooling library.
     Replace this with your preferred DataSource implementation -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    init-method="createDataSource" destroy-method="close">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:~/maven-test" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<!-- Using Spring JDBC for transaction management -->
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="transactionAwareDataSource"
    class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource" />
</bean>

<!-- Bridging Spring JDBC data sources to jOOQ's ConnectionProvider -->
<bean class="org.jooq.impl.DataSourceConnectionProvider" 
      name="connectionProvider">
    <constructor-arg ref="transactionAwareDataSource" />
</bean>

从GitHub可以看到一个正在运行的示例:

> https://github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/jOOQ-spring-example

春天和贵族的例子

虽然我个人不会推荐它,但有些用户已经成功取代了Guice的Spring DI的一部分,并处理与Guice的交易.对于这种用例,GitHub还有一个经过整合测试的运行示例:

> https://github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/jOOQ-spring-guice-example

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读