admin

JOOQ & transactions

sql

假设我为JOOQ提供了一个自定义ConnectionProvider,它恰好使用自动提交设置为false的连接池。

实现大致是:

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

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

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

使用DefaultConnectionProvider很容易,因为只有一个连接-但是对于池,我不确定该怎么做。


阅读 265

收藏
2021-05-10

共1个答案

admin

jOOQ 3.4交易API

使用jOOQ 3.4,已添加事务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.TransactionProviderSPI可用于覆盖默认行为,它通过JDBC使用实现嵌套事务Savepoints

春天的例子

当前文档显示了使用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获得一个运行中的示例:

Spring and Guice的例子

尽管我个人不建议这样做,但是某些用户已经成功地用Guice替换了Spring
DI的一部分,并与Guice进行了交易。在该用例上,GitHub上还有一个经过集成测试的运行示例:

2021-05-10