Session session = sessionFactory.openSession();
String hql = "from User";
Query query = session.createQuery(hql);
List users = query.list();
for(int i = 0; i < users.size(); i++) {
User user = (User) users.get(i);
System.out.println(user.getName());
}
query = session.createQuery(hql);
users = query.list();
for(int i = 0; i < users.size(); i++) {
User user = (User) users.get(i);
System.out.println(user.getName());
}
session.close();
在不启用Query快取的情况下,Hibernate会使用两次SQL向数据库查询数据:Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_ from user user0_ momor caterpillar Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_ from user user0_ momor caterpillar如果打算启用Query快取功能,首先在hibernate.cfg.xml中设定hibernate.cache.use_query_cache属性:
<?xml version="1.0" encoding="utf-8"?>然后在每次建立Query实例时,执行setCacheable(true):
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
....
<property name="hibernate.cache.use_query_cache">true</property>
....
</session-factory>
</hibernate-configuration>
Session session = sessionFactory.openSession();
String hql = "from User";
Query query = session.createQuery(hql);
// 使用Query快取
query.setCacheable(true);
List users = query.list();
for(int i = 0; i < users.size(); i++) {
User user = (User) users.get(i);
System.out.println(user.getName());
}
query = session.createQuery(hql);
// 使用Query快取
query.setCacheable(true);
users = query.list();
for(int i = 0; i < users.size(); i++) {
User user = (User) users.get(i);
System.out.println(user.getName());
}
session.close();
Hibernate在启用Query快取后,会保留执行过的查询SQL与查询结果,在下一次查询时会看看SQL是否相同,并看看对应的数据库表格是否有变
动(Update/Delete/Insert),如果SQL相同且数据库也没有变动,则将Query快取中的查询结果返回,上面的程序片段将使用一次
SQL查询,第二次查询时直接返回快取中的结果:Hibernate: select user0_.id as id, user0_.name as name0_, user0_.age as age0_ from user user0_ momor caterpillar momor caterpillar