假设我向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,用于对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