休眠命名查询是否在真正意义上进行了预编译?

2022-09-04 03:31:01

预编译的查询由数据库供应商(如oracle,sql server等)提前编译和缓存,以便它们可以更快地进行连续调用,如预准备语句。

在休眠中,命名查询被称为在 Web 服务器启动时预编译的。这是否意味着所有查询都是在服务器启动时触发的,以便它们可以由数据库供应商预编译,或者预编译在休眠上下文中具有不同的含义?


答案 1
  1. Hibernate 命名查询以对象查询语言(JPQL 或 HQL)表示,因此 Hibernate 需要先将它们转换为 SQL。命名查询存储在 NamedQueryRepository 中,每个查询都由 NamedQueryDefinition 表示。

由于用户可以动态添加筛选器、查询结果限制、锁和提示,因此 Hibernate 在执行之前无法预编译 HQL/JPQL。

  1. Hibernate还为每个SELECT和DML语句使用ReadkStatement,因此如果JDBC驱动程序支持它并且通过在单个数据库请求(例如MySQL,PostgreSQL)中多路复用准备和执行来模拟准备阶段,您也可以获得数据库语句预编译。

答案 2

推荐