Hibernate缓存管理

来源:互联网 发布:软件测试吉安 编辑:程序博客网 时间:2024/04/30 18:30

Hibernate缓存分类:

1、一级缓存(session缓存,又称作事物缓存): Hibernate内置的,不能卸除。

缓存范围:缓存只能被当前的Session对象访问。缓存的生命周期依赖于Session的生命周期,当Session被关闭后,缓存也就结束生命周期。

2、二级缓存(SessionFactory缓存,又称作应用缓存):

缓存范围:缓存被应用范围内的所有session共享,不同的session可以共享。这些session可能是并发的访问缓存,所以必须对缓存进行更新,它的生命周期依赖于应用的生命周期。

如何使用二级缓存:

(1)、在HIbernate配置文件Hibernate.cfg.xml中:

//设置二级缓存插件EHCache的provider类。

   <property name="cache.provider_class"> org.hibernate.cache.EhCacheProvider</property> 

//使用二级缓存 ,以缓存使用find(),list().....................等方法查询

<property name="cache.use_second_level_cache">true</property>

(2)、在项目的src目录下创建EHCache的配置文件ehcache.xml

 

<?xml version='1.0' encoding='UTF-8'?>
<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10000"<!-- 缓存对象的最大数目 -->
        eternal="false" <!-- 是否为永不过期,一般设置为false(过期)  -->
        timeToIdleSeconds="120"<!--对象处于空闲状态的最多秒数  -->
        timeToLiveSeconds="120"<!--对象处于缓存的最多秒数  -->
        overflowToDisk="true"<!--内存溢出时,是否写入硬盘  -->
        />
</ehcache>

(3)、在需要缓存的持久化对象的映射文件中配置相应的二级缓存策略。

例如:User.hbm.xml

 

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="ied.houserent.pojo.User" table="user" catalog="houserent">
    <cache usage="read-write"/>
   
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="50" not-null="true" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="128" not-null="true" />
        </property>
        <property name="telephone" type="java.lang.String">
            <column name="telephone" length="15" />
        </property>
        <property name="username" type="java.lang.String">
            <column name="username" length="50" />
        </property>
        <property name="isadmin" type="java.lang.Integer">
            <column name="isadmin" />
        </property>
        <set name="houses" inverse="true">
            <key>
                <column name="user_id" not-null="true" />
            </key>
            <one-to-many class="ied.houserent.pojo.House" />
        </set>
    </class>
    <query name="findByName">
     <![CDATA[
      from User u where u.name=:name
     ]]>     
    </query>
    <sql-query name="findByNameBySQL">
     <![CDATA[
      select * from user where name=?
     ]]>
    </sql-query>
</hibernate-mapping>

 

(4)、测试类:

package ied.houserent.test;

import org.hibernate.Session;

import ied.houserent.dao.HibernateSessionFactory;
import ied.houserent.pojo.User;

public class TestCache {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  Session session=HibernateSessionFactory.getSession();
  
    User user1=(User) session.load(User.class, 1);
    System.out.println(user1.getName());
   
    session.close();
   
   
    Session session2=HibernateSessionFactory.getSession();
    User user2=(User) session2.load(User.class, 1);
    System.out.println(user2.getName());
   
    session2.close();
   
 

 }

}

5、控制台输出:

Hibernate:
    select
        user0_.id as id3_0_,
        user0_.name as name3_0_,
        user0_.password as password3_0_,
        user0_.telephone as telephone3_0_,
        user0_.username as username3_0_,
        user0_.isadmin as isadmin3_0_
    from
        houserent.user user0_
    where
        user0_.id=?
xx
xx