在没有 PureQuery 的情况下对 DB2 执行静态 SQL 查询

Posted

技术标签:

【中文标题】在没有 PureQuery 的情况下对 DB2 执行静态 SQL 查询【英文标题】:Performing static SQL queries against DB2 without PureQuery 【发布时间】:2010-03-18 16:32:09 【问题描述】:

我想将 JPA over JDBC 用于新应用程序。我严格使用 JPA 实体管理器的命名查询和基本 CRUD 方法,它允许我(在 Hibernate 或任何其他 JPA 实现的帮助下)提取将在数据库上执行的所有 SQL 本机查询。通过这个静态查询列表,我知道我可以构建一个 DB2 包,它是我的请求的所有执行计划。

所以我的问题是:通过 JDBC 对 DB2 执行这些查询是否会利用这些执行计划?我了解 PureQuery 产品可以捕获 sql 订单列表。它是否仍然通过 JDBC 而不是通过 PureQuery 特定的 API 提供更多?这样一个特定的 DB2 静态绑定特性?还是相当于JDBC?

感谢您的任何回答。

【问题讨论】:

问题已经回答了,无论如何,请随意添加与此主题相关的其他cmet! 【参考方案1】:

JDBC 应用程序只执行动态 SQL(即 DB2 不使用静态包)。

只有 2 种方法可以获得静态 SQL(查询存储在数据库中的包中):使用 SQLJ 编写应用程序(消除 JPA/Hibernate)或使用 pureQuery(位于 JDBC 和数据库之间) .

请记住,即使使用动态 SQL,DB2 也会缓存查询的执行计划,因此如果它们执行得足够频繁(即它们保留在缓存中),那么您将不会看到查询编译的开销。缓存仅在查询是精确的逐字节匹配时才有用,因此select * from t1 where c1 = 1select * from t1 where c1 = 2 不同,select * from t1 where C1 = 1 也不同(给出相同的结果,但查询不同)。使用参数标记 (select * from t1 where c1 = ?) 是关键。您的 DBA 可以调整目录缓存的大小,以帮助最大限度地提高此缓存的命中率。

虽然缓存有助于避免重复编译查询,但它不能提供静态 SQL 所提供的计划稳定性,因此是 YMMV。

【讨论】:

感谢您的宝贵回答 :)

以上是关于在没有 PureQuery 的情况下对 DB2 执行静态 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 UI 的情况下对钩子进行 Jest 测试

如何在没有操作的情况下对 Pandas 数据框进行分组或聚合

如何在没有评估环境的情况下对函数进行集群导出

在没有表单输入的情况下对 FileList 数据进行排序

如何在没有协议的情况下对输入类型 url 使用 jQuery 验证?

在没有复制粘贴到控制台的情况下对 Django 授权进行 Spotipy