Session session = sessionFactory.openSession(); User user1 = (User) session.load(User.class, new Integer(1)); user1.getName(); session.close(); session = sessionFactory.openSession(); User user2 = (User) session.load(User.class, new Integer(1)); user2.getName(); session.close();则Hibernate将会使用以下的SQL来进行数据查询:
Hibernate: select user0_.id as id0_, user0_.name as name0_0_, user0_.age as age0_0_ from user user0_ where user0_.id=? Hibernate: select user0_.id as id0_, user0_.name as name0_0_, user0_.age as age0_0_ from user user0_ where user0_.id=?由于Session被关闭,Session level无法起作用,所以第二次的查询仍必须向数据库直接查询。
<ehcache>将这个档案放在Hibernate项目Classpath可存取到的路径下,接着重新运行上面的程序片段,您可以发现Hibernate将使用以下的SQL进行查询:
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>
Hibernate: select user0_.id as id0_, user0_.name as name0_0_, user0_.age as age0_0_ from user user0_ where user0_.id=?二级快取被同一个SessionFactory所建立的Session实例所共享,所以即使关闭了Session,下一个Session仍可使用二级快 取,在查询时,Session会先在Session level快取中查询看有无数据,如果没有就试着从二级快取中查询数据,查到数据的话就直接返回该笔数据,所以在上例中,第二次无需再向数据库进行SQL查询。
sessionFactory.evict(User.class, user.getId());如果打算在Hibernate中使用其它第三方产品进行快取,则可以在hibernate.cfg.xml中定义hibernate.cache.provider_class属性,例如:
<?xml version="1.0" encoding="utf-8"?>HashtableCache是Hibernate自己所提供的二级快取实现,不过性能与功能上有限,只用于开发时期的测试之用。
<!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.provider_class">
org.hibernate.cache.HashtableCacheProvider
</property>
....
</session-factory>
</hibernate-configuration>
<?xml version="1.0" encoding="utf-8"?>可以设定的策略包括read-only、read-write、nonstrict-read-write与transactional,并不是每一个第三方快取实现都支持所有的选项,每一个选项的使用时机与支持的产品,可以直接参考Hibernate官方参考手册的 20.2. The Second Level Cache。
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="user">
<cache usage="read-only"/>
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="age" column="age" type="java.lang.Integer"/>
</class>
</hibernate-mapping>