我正在尝试以旧方式转换执行 SQL 查询的旧应用程序,如下所示:
java.sql.Connection connection = ....
String queryStr="select acct from Person where acct in (select acct from Document where dbcreate_date > DATEADD(hh,-12, GETDATE())) and status not in ('A','P')";
...
...
java.sql.Statement statement = connection.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs = statement.executeQuery(queryStr);
上面的代码大约需要 10 毫秒。这包括获取数据库连接、创建语句和执行查询。
我现在使用 Hibenate HQL 并创建了一个这样的 HQL 查询:
Query query = session.createQuery("select p.acct from Person p where p.acct in (select acct from Document d where create_date > :date and status not in ('A','P'))");
现在只是这个语句“session.createQuery(....)”大约需要 105 毫秒,这大约是上面提到的以旧方式执行整个查询的 10 倍。
现在我不太确定 Hibernate 查询缓存是如何工作的,但如果我再次运行同样的 HQL 语句,大约需要 5 毫秒。
现在我的问题是为什么使用 Hibernate HQL 会发生这种行为?任何人都知道“session.createQuery(...)”方法内部发生了什么,第一次需要更长的时间,但第二次运行的时间要少得多?我还注意到,Hibernate 在执行“query.list()”时两次都对数据库执行 SQL。
谢谢。