zoukankan      html  css  js  c++  java
  • hibernate 缓存

    缓存在hibernate中是天生就有的,是一级缓存,当session关闭时一级缓存就失效了

    一级缓存是内置的,生效范围是在同一个session中才行.二级缓存是需要配置才有

    判断当前项在不在一级缓存中,contains

    session.beginTransaction();
            
    User u1 = (User) session.get(User.class, 27);
    //session.clear();
    //session.evict(u1);
    System.out.println(session.contains(u1));
    session.getTransaction().commit();

     clear方法和evict方法

    clear方法用于将所有对象从一级缓存中清除
    evict方法用于将指定对象从一级缓存中清除

    二级缓存 

    在Hibernate中二级缓存在SessionFactory中实现,由一个SessionFactor
    的所有Session实例所共享。Session在查找一个对象时,会首先在自己的
    一级缓存中进行查找,如果没有找到,则进入二级缓存中进行查找,如果二级缓
    存中存在,则将对象返回,如果二级缓存中也不存在,则从数据库中获得。

    1.在根目录中配置ehcache.xml 

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache>
             
        <diskStore path="java.io.tmpdir"/>
        
        <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
        />
    </ehcache>

    2.pom.xml中添加jar包依赖

    <!-- hibernate-release-4.2.0.Finalhibernate-release-4.2.0.Finalliboptionalehcache -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.6</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>4.2.0.Final</version>
        </dependency>

    3.开启二级缓存

    开启二级缓存 使用EhCache实现  在hibernate.cfg.xml配置

    路径是导入的jar包(hibernate-ehcache)的EhCacheRegionFactory路径

    <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

    4.使用2级缓存  

    <?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">
    <hibernate-mapping package="com.kaishengit.pojo">
        
        <class name="User" table="user">
        <!-- 这里表示使用2级缓存,缓存user,也只有查询user才使用2级缓存 -->
            <cache usage="read-write"/>
            <id name="id">
                <generator class="native"/>
            </id>
            
            <property name="username"/>
            <property name="password"/>
            
            <set name="addressSet" cascade="delete" inverse="true">
            <!-- 这里表示查询Address,2级缓存有效,会缓存address的id,所以再使用时会有根据id查询address的sql
                如果要缓存address对象,就要在address.hbm.xml中配置.-->
                <cache usage="read-write"/>
                <key column="userid"/>
                <one-to-many class="Address"/>
            </set>
            
        </class>
    
    
    </hibernate-mapping>

    read-only:只读。对于不会发生改变的数据,可以使用只读性缓存。
    read-write:可读写缓存。用于对数据同步要求严格的情况。
    nonstrict-read-write:如果程序对并发访问下的数据同步要求不是很严格,
    且数据更新操作不频繁时可采用该缓存策略

  • 相关阅读:
    读写文件
    c++ 中的 -> :: : .
    CDH安装步骤
    MySQL安全配置向导mysql_secure_installation详解
    Linux下彻底卸载mysql详解
    安装mysql警告: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
    为Hadoop集群选择合适的硬件配置
    利用cm压缩包手动安装cm和cdh
    CM5.11与CDH5.11安装使用说明
    法的本体
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4463364.html
Copyright © 2011-2022 走看看