Java JOOQ 与 SQL Server:缓存查询

Posted

技术标签:

【中文标题】Java JOOQ 与 SQL Server:缓存查询【英文标题】:Java JOOQ with SQL Server: Caching queries 【发布时间】:2021-11-05 00:26:25 【问题描述】:

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

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

构建 jOOQ 查询需要一些时间。如果你可以重复使用 相同的查询,你可以缓存它们。

JOOQ 是否删除任何 Microsoft SQL 服务器缓存功能?我应该专门用 JOOQ 做些什么来缓存 sql 计划,还是 SQL Server 会自动处理它?

SQL Server caching

Does jooq has any performance lead over simple sql in java

【问题讨论】:

JOOQ 是否删除任何 Microsoft SQL 服务器缓存功能? 有点。 SQL Server 缓存以@@OPTIONS 为键的执行计划以及语句散列。这适用于重用语句和参数化查询。除此之外,jOOQ 还支持带有inlined parameters 的语句,它实际上将查询参数值注入到 SQL 语句中——这意味着语句是不同的,因此在使用不同的参数时会有不同的执行计划。 @LukasEder 我从来没有说过默认情况下会这样做。但是,如果您使用内联参数,则会通过为每个参数组合提交不同的计划来破坏 SQL Server 的计划缓存。 @AlwaysLearning:但是 OP 的问题是一个笼统的问题,您的观点是关于一个与 jOOQ 无关的特定功能。您可以使用任何向 SQL Server 发送语句的方法内联值,包括直接使用 JDBC。 【参考方案1】:

构建 jOOQ 查询需要一些时间。如果您可以重复使用相同的查询,则可以缓存它们。

这是关于 SQL 字符串 的客户端生成,每次运行 SQL 查询时都会重新生成 (with jOOQ's queries being all dynamic by default)。您在上面引用的同一页还说:

明智地优化

在极少数情况下,jOOQ 的客户端开销可能会影响应用程序的吞吐量。在这些情况下,您可能对在客户端缓存 SQL 字符串甚至准备好的语句感兴趣,但只有在可以测量实际问题时才应该这样做。

JOOQ 是否删除任何 Microsoft SQL 服务器缓存功能?

不,一点也不。所有 jOOQ 查询都创建为 JDBC PreparedStatement using bind values by default。您显然可以覆盖此默认值,因为总是有理由这样做,但默认值是使用准备好的语句来使服务器端的准备好的语句缓存受益。

我应该专门用 JOOQ 做些什么来缓存 sql 计划,或者 SQL Server 会自动处理它吗?

SQL 服务器会自动处理它。

【讨论】:

@mattsmith5:你可以手动完成。但除非您非常确定这是一个瓶颈,否则您不应该担心它。 @mattsmith5:嗯,你在另一个问题中问过这个问题,所以我在那里回答了:) 顺便说一句,我假设 JOOQ 可以与 AzureSQL 和其他基于 mssql 云的服务一起使用,可能是 Amazon AWS 和 Sqlserver vm?我认为它会,因为它会在下面创建 JDBC 语句,我们公司正在考虑云迁移,再次感谢和惊人的产品! @mattsmith5:是的,它适用于 AzureSQL。存在通常的限制,因为它的工作方式与本地 SQL Server 安装的工作方式不同(例如:github.com/jOOQ/jOOQ/issues/12291),但我们会密切注意此类问题并在需要时进行相应修复.

以上是关于Java JOOQ 与 SQL Server:缓存查询的主要内容,如果未能解决你的问题,请参考以下文章

将 JooQ 与 SQL Server 一起使用,getTables() 方法返回服务器上所有数据库中的所有表

SQL Server 2017 - 使用 Gradle 生成 JOOQ 代码

如何修复:Jooq 代码不会从 sql 脚本为内存 db 中的 sqlite 生成 java 代码

Information_schema 未从 jooq for SQL Server 生成

使用 jOOQ 执行 PL/SQL 函数时的 Java 空指针

带有准备好的语句的 Java JOOQ