Hibernate中二级缓存的配置_hibernate缓存
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
我们知道
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" class="pack.java.hibernate.pojo.User"/>
</session-factory>
</hibernate-configuration>
在Hibernate.cfg.xml文件中开启了二级缓存,查询缓存和设置缓存的提供者,以及指定了那些实体需要使用二级缓存。
如果你使用的二级缓存实现是ehcache的话,需要配置ehcache.xml
内容如下:
<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 class="identity"></generator>
</id>
<property name="uname" 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 stub
if(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方法都会在二级缓存中取数据.
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |