假设我为JOOQ提供了一个自定义ConnectionProvider,它恰好使用自动提交设置为false的连接池。
ConnectionProvider
实现大致是:
@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以通过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。
org.jooq.TransactionProvider
Savepoints
当前文档显示了使用Spring进行事务处理时的示例:
这个例子本质上归结为使用Spring TransactionAwareDataSourceProxy
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获得一个运行中的示例:
尽管我个人不建议这样做,但是某些用户已经成功地用Guice替换了Spring DI的一部分,并与Guice进行了交易。在该用例上,GitHub上还有一个经过集成测试的运行示例: