首页 > 解决方案 > 带有准备好的语句的 Java JOOQ

问题描述

我正在将 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);

jooq 是否有任何性能领先于 java 中的简单 sql

标签: javasql-serverspring-bootjooq

解决方案


正如那个链接的文档页面(“明智地优化”)和我之前的回答中提到的,你可能不应该担心这些事情——当然不是先验的。

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

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

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

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

此外,使用这种方法,您将放弃 jOOQ 在执行查询时提供的许多不错的功能(例如 newMULTISET运算符


推荐阅读