带有准备好的语句的 Java JOOQ

Posted

技术标签:

【中文标题】带有准备好的语句的 Java JOOQ【英文标题】:Java JOOQ with Prepared Statements 【发布时间】:2021-11-05 00:42:45 【问题描述】:

我正在将 JOOQ 与 Microsoft SQL Server 2019 一起使用。它在此参考中指出,

https://www.jooq.org/doc/3.0/manual/sql-execution/performance-considerations/

渲染 SQL 字符串需要一些时间。在内部,jOOQ 重用 相同的 java.lang.StringBuilder 用于完整的查询,但有些 渲染元素可能需要一些时间。你当然可以缓存 jOOQ 生成的 SQL 并准备你自己的 java.sql.PreparedStatement 对象

我正在阅读有关 Java Prepared statements Prepared SQL 的资源 You could, of course, cache SQL generated by jOOQ and prepare your own java.sql.PreparedStatement objects 这行对我来说没有意义。使用 PreparedStatement 不会只是添加另一种语言并降低 JOOQ 的类型/字符串安全的整个目的吗? JOOQ 甚至如何与 Prepared 语句一起使用?有代码解释吗?尝试使用这种策略编写代码。

String sql = "select * from people where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setLong(123);

Does jooq has any performance lead over simple sql in java

【问题讨论】:

这真的是一个不同的问题from your previous one? 是的,我想,我会逐点逐一介绍,确保我们的程序员和工程师理解,*** 不喜欢我在一篇文章中包含太多问题,只是想知道如何做到这一点? “当然,您可以缓存 jOOQ 生成的 SQL 并准备您自己的 java.sql.PreparedStatement 对象” 【参考方案1】:

正如链接文档页面(“明智地优化”)和我的 previous answer 中所述,您可能不应该担心这些事情 - 当然不是先验的。

要回答您的问题,您可以从任何 jOOQ 查询中提取 SQL 字符串并绑定值,如下所示:

String sql = query.getSQL();
List<Object> binds = query.getBindValues();

然后对它们做任何你喜欢的事情,包括缓存值和准备你自己的语句,而不是直接使用 jOOQ 执行查询。

但同样,正如该链接页面中所声明的那样,您不必担心任何此类开销。例如,在对几乎没有数据的内存 H2 数据库运行 10000 次相同的琐碎查询时,SQL 字符串生成的开销是可测量的,但在通过网络对具有真实世界工作负载的远程 SQL Server 运行普通查询时则不然。

此外,使用这种方法,您将放弃 jOOQ 在执行查询时提供的许多不错的功能 (e.g. the new MULTISET operator)

【讨论】:

以上是关于带有准备好的语句的 Java JOOQ的主要内容,如果未能解决你的问题,请参考以下文章

插入带有准备好的语句的日期时间[重复]

带有位域的 PDO 准备好的语句

带有 IN() 条件的 WordPress 准备好的语句

带有准备好的语句的 PostgreSQL 内部查询

带有准备好的语句的 SELECT 的 JSON 输出

准备好的语句失败(带有错误消息!)