既然你正在寻找一个库来做这种事情,是的,jOOQ 可以通过它为你做这件事,BatchedConnection
你甚至不必使用 jOOQ 的 DSL 来访问这个功能,尽管它也适用于 DSL . 以下代码片段说明了它是如何工作的。
假设你有这个逻辑:
// This is your original JDBC connection
try (Connection connection = ds.getConnection()) {
doSomethingWith(connection);
}
// And then:
void doSomethingWith(Connection c) {
try (PreparedStatement s = c.prepareStatement("INSERT INTO t (a, b) VALUES (?, ?)")) {
s.setInt(1, 1);
s.setInt(1, 2);
s.executeUpdate();
}
try (PreparedStatement s = c.prepareStatement("INSERT INTO t (a, b) VALUES (?, ?)")) {
s.setInt(1, 3);
s.setInt(1, 4);
s.executeUpdate();
}
try (PreparedStatement s = c.prepareStatement("INSERT INTO u (x) VALUES (?)")) {
s.setInt(1, 1);
s.executeUpdate();
}
try (PreparedStatement s = c.prepareStatement("INSERT INTO u (x) VALUES (?)")) {
s.setInt(1, 2);
s.executeUpdate();
}
}
现在,您可以简单地用 jOOQ 胶水代码包装它,而不是重新编写代码:
// This is your original JDBC connection
try (Connection connection = ds.getConnection()) {
// Now wrap that with jOOQ and turn it into a "BatchedConnection":
DSL.using(connection).batched(c -> {
// Retrieve the augmented connection again from jOOQ and run your original logic:
c.dsl().connection(connection2 -> {
doSomethingWith(connection2);
});
});
}
现在,无论您的方法doSomethingWith()
对 JDBC 连接做什么,它现在都尽可能好地进行批处理,即前两个插入被批处理在一起,第三个和第四个插入也是如此。