我想转换执行SQL的旧应用程序查询,如下的老路上:Hibernate的HQL的createQuery
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。
谢谢。
是的它是有道理的。我是Hibernate缓存的新手,但我开始明白它的好处以及如何正确使用它。感谢您的回答。 – Marquinio 2012-04-10 01:21:37