首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Hibernate中二级缓存的配备

2012-10-14 
Hibernate中二级缓存的配置我们知道hibernate的session提供了一级缓存,每个session,对同一个id进行两次loa

Hibernate中二级缓存的配置

我们知道

hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了,所以一级缓存默认Hibernate就提供了。

二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等,需要设置hibernate.cache.provider_class,我们这里用ehcache,在2.1中就是
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
如果使用查询缓存,加上
hibernate.cache.use_query_cache=true

缓存可以简单的看成一个Map,通过key在缓存里面找value。

下面开始配置Hibernate.cfg.xml文件,在该文件中加入二级缓存的配置:

<?xml version='1.0' encoding='UTF-8'?><!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="connection.username">root</property><property name="connection.password">mysql</property><property name="connection.url">jdbc:mysql://localhost/mysqldemo</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="show_sql">true</property><property name="format_sql">true</property><!--自动在数据库中生成表<property name="hibernate.hbm2ddl.auto">create</property>--><!-- 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- 设置缓存提供者 --><property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property><!-- 查询缓存 --><property name="hibernate.cache.use_query_cache">true</property><!-- 映射文件 --><mapping resource="pack/java/hibernate/mapping/User.hbm.xml"/><!-- 指定哪些实体需要使用二级缓存,usage属性指定缓存的策略 --><class-cache usage="read-only" name="code"><echcache><diskStore path="java.io.tmpdir"/><!-- 默认缓存配置;maxElementslnMemory 属性指定缓存中最多可以放多少个对象eternal 属性指定缓存是否永久有效timeToldleSeconds 属性指定缓存多久未被使用便清理掉timeToLiveSecods  属性指定缓存的生命长度diskPersistent 属性指定缓存是否被持久化硬盘中,保存路径由标签指定。 --><defaultCache maxElementslnMemory="10000"   eternal="false" overflowToDisk="true" timeToldleSeconds="120" timeToLiveSecods="120" diskPersistent="false" /></echcache>

?

然后,在建立一个User.hbm.xml映射文件:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="pack.java.hibernate.pojo.User" table="User">  <!-- 使用这种方式也可以应用缓存   <cache usage="read-only"/>  -->  <id name="uid" column="UID" type="java.lang.Integer">  <generator column="UNAME"></property>  <property name="age" column="AGE"></property>  <property name="address" column="ADDRESS"></property>  <property name="sex" type="java.lang.Boolean">  <column name="SEX" sql-type="tinyint"></column>  </property>  <property name="remark" column="REMARK"></property> </class></hibernate-mapping>

?

?

定义个Model取名为User:

public class User implements Serializable{private static final long serialVersionUID = 1628733968156346447L;private Integer uid;private String uname;private Integer age;private String address;private Boolean sex;private String remark;        //getter和setter方式省略}

?

然后就是建立一个测试类:

/** * 查询所有用户信息; */@SuppressWarnings("unchecked")public List<User> queryUser() {// TODO Auto-generated method stubif(session==null){session = getSession();}    query = session.createQuery("from "+User.class.getName()+" u where u.uname in('100','101','102','103','104','105')");query.setCacheable(true);query.setFirstResult((0)*1000).setMaxResults(1000);List<User> list = query.list();for(User user:list){System.out.println("~~~~~~~~"+user.getUid()+","+user.getUname()+","+user.getSex()+","+user.getAddress());}session.close();if(!session.isOpen()){session = getSession();}User user = (User) session.get(User.class,  29145);query.setCacheable(true);System.out.println("~~~~~~~~"+user.getUid()+","+user.getUname()+","+user.getSex()+","+user.getAddress());session.close();return list;}

?

在结果中Hibernate只会去查询一次数据库..然后把结果放到二级缓存中..第二次查询时,如果查询的结果在二级缓存中,就直接从二级缓存中取.如果二级缓存中不存在.则会到数据库中取出.

?

这里说明一点.网上有些人说使用get的方式不会在二级缓存中取..

其实不是..get 和 load方法都会在二级缓存中取数据.

?

?

热点排行