【发布时间】:2021-09-16 08:29:23
【问题描述】:
我有一个用例,我想将 jdbc 事务与 jooq 上下文混合。
JDBC 代码如下所示:
public void inTransaction(InTransaction lambda) {
DataSource ds = dataSource.get();
try (Connection connection = ds.getConnection()) {
try {
logger.info("set autocommit to false");
connection.setAutoCommit(false);
try (Statement statement = connection.createStatement()) {
lambda.execute(statement);
logger.info("commiting transaction");
connection.commit();
}
} catch (RuntimeException e) {
logger.info("rolling back transaction");
connection.rollback();
throw e;
} finally {
logger.info("set autocommit to true");
connection.setAutoCommit(true);
}
} catch (SQLException e) {
throw new TilerException(e);
}
}
@FunctionalInterface
public interface InTransaction {
void execute(Statement statement) throws SQLException;
}
我希望lambda 参数能够与 jdbc 和 jooq 一起使用。
对于 jdbc,使用语句非常简单。例如这样的tutorail:
inTransaction(stmt -> {
String SQL = "INSERT INTO Employees " +
"VALUES (106, 20, 'Rita', 'Tez')";
stmt.executeUpdate(SQL);
String SQL = "INSERTED IN Employees " +
"VALUES (107, 22, 'Sita', 'Singh')";
stmt.executeUpdate(SQL);
});
为了对同一事务执行 jooq 查询,我必须获取上下文。我找到了一个 api 从数据源/连接中获取 DSLContext。
我不清楚的是是否/如何从声明中创建 jooq DSLContext?
【问题讨论】:
-
我不明白你的问题。使用 DSL.using 创建 DslContext 时,您必须将连接传递给配置。并且提交发生在连接上。
-
我想传递一个语句而不是连接。我已经在使用该语句使用 jdbc 运行其他查询/更新。
-
很抱歉,您的代码没有意义,因为您只能在每个事务的语句上执行。这将与自动提交相同
-
除此之外还有一个未解决的问题:github.com/jOOQ/jOOQ/issues/3715
-
我添加了一个如何使用该方法的示例。同一事务的多个查询中使用相同的语句。