我一直在读约
transactions & jooq,但我很难看到如何在实践中实现它.
@H_403_2@假设我向JOOQ提供了一个自定义的ConnectionProvider,它恰好将一个连接池与autocommit设置为false.
@H_403_2@实施大致如下:
@Override public Connection acquire() throws DataAccessException { return pool.getConnection(); } @Override public void release(Connection connection) throws DataAccessException { connection.commit(); connection.close(); }@H_403_2@我将如何将两个jooq查询包装到单个事务中? @H_403_2@DefaultConnectionProvider很容易,因为只有一个连接 – 但是有一个池我不知道该怎么做.
解决方法
jOOQ 3.4 Transaction API
@H_403_2@使用jOOQ 3.4,已经添加了一个transaction API,用于对JDBC,Spring或JTA事务管理器进行抽象.此API可以与Java 8一起使用:
>例外情况下回滚 @H_403_2@
DSL.using(configuration) .transaction(ctx -> { DSL.using(ctx) .update(TABLE) .set(TABLE.COL,newValue) .where(...) .execute(); });@H_403_2@或者使用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(); } });@H_403_2@这个想法是,lambda表达式(或匿名类)形成事务代码,其中: @H_403_2@>正常完成时提交
>例外情况下回滚 @H_403_2@
org.jooq.TransactionProvider
SPI可用于覆盖默认行为,该行为通过使用Savepoints
的JDBC实现可嵌套事务.
@H_403_2@一个春天的例子
@H_403_2@当前的文档显示了使用Spring进行事务处理的一个例子:
@H_403_2@> http://www.jooq.org/doc/latest/manual/getting-started/tutorials/jooq-with-spring/
@H_403_2@这个例子基本上归结为使用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>@H_403_2@从GitHub可以看到一个正在运行的示例: @H_403_2@> https://github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/jOOQ-spring-example @H_403_2@春天和贵族的例子 @H_403_2@虽然我个人不会推荐它,但有些用户已经成功取代了Guice的Spring DI的一部分,并处理与Guice的交易.对于这种用例,GitHub还有一个经过整合测试的运行示例: @H_403_2@> https://github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/jOOQ-spring-guice-example