gpt4 book ai didi

java - JOOQ & 交易

转载 作者:搜寻专家 更新时间:2023-10-30 19:54:34 28 4
gpt4 key购买 nike

我一直在阅读 transactions & jooq但我很难看到如何在实践中实现它。

假设我为 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 很容易,因为只有一个连接 - 但对于池,我不确定如何去做。

最佳答案

jOOQ 3.4 事务 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例子

当前文档显示了使用 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 和 Guice 示例

虽然我个人不推荐,但一些用户已经成功地用Guice替换了Spring的一部分DI,并用Guice处理事务。 GitHub 上还有针对此用例的经过集成测试的运行示例:

关于java - JOOQ & 交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20046247/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com