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);
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中使用本机查询来比较性能:
Query query = session.createSQLQuery("select acct from Person where acct in (select acct from Document where dbcreate_date > DATEADD(hh,-12, GETDATE())) and status not in ('A','P')");
关于表演:
您并不是真的将您的两个查询进行类似的比较。
如果只执行一次,那么简单的JDBC版本可能会比HQL更快,因为HQL将在最初编译。
这里有一些关于Statement和PreparedStatement的有趣信息:
http://oreilly.com/catalog/jorajdbc/chapter/ch19.html
语句与PreparedStatement
人们普遍认为使用PreparedStatement对象比使用Statement对象更快。毕竟,准备好的语句只需对数据库验证一次它的元数据,而语句每次都要这样做。那怎么可能是其他方式呢?事实上,一条准备好的语句需要大约65次迭代才能赶上一条语句的总执行时间。这对应用程序的性能有影响,本节的重点就是探讨这些问题。
当涉及到在典型使用下哪个SQL语句对象性能更好,语句还是PreparedStatement时,事实是语句对象产生的性能最好。当您考虑如何在应用程序中通常使用SQL语句时--这里是每个事务1或2条,可能是10-20条(很少更多)--您会意识到Statement对象将比PreparedStatement对象在更短的时间内执行它们。