一尘不染

Hibernate命名查询是否是在真正意义上预先编译的?

hibernate

预编译的查询由数据库供应商(例如oracle,sql server等)预先编译和缓存,因此对于诸如prepared语句之类的后续调用,它们可以更快。

在“hibernate命名”中,据说查询是在Web服务器启动时预先编译的。这是否意味着所有查询都会在服务器启动时自动触发,以便数据库供应商可以对其进行预编译,或者在hibernate上下文中进行预编译具有不同的含义?


阅读 253

收藏
2020-06-20

共1个答案

一尘不染

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

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

  1. Hibernate还为每个SELECT和DML语句使用PreparedStatement,因此,如果JDBC驱动程序支持它并且不通过在单个数据库请求(例如MySQL,PostgreSQL)中复用prepare和execute来模拟prepare阶段,则还可以获取数据库语句预编译。 )。
2020-06-20