IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Hibernate二级缓存 -> 正文阅读

[Java知识库]Hibernate二级缓存

  1. 基本配置:
    pom.xml中引入与当前hibernate对应版本的hibernate-ehcache包
    <!-- hibernate缓存包 -->
    		<dependency>
    			<groupId>org.hibernate</groupId>
    			<artifactId>hibernate-ehcache</artifactId>
    			<version>${hibernate.version}</version>
    		</dependency>
  2. 在hibernate.cfg.xml中开启二级缓存

    <!-- 缓存设置 -->
    ? <property name="hibernate.cache.use_second_level_cache">true</property>
    <!-- 缓存注入类配置?-->
    <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
    注:查看该?类的方法一般是到引入的包中找到EhcacheRegionFactory.class这个类

  3. 根目录中创建ehcache.xml



    ?
    <?xml version="1.0" encoding="UTF-8"?>  
    <ehcache>  
      <!--如果缓存中的对象存储超过指定的缓存数量的对象存储的磁盘地址-->  
      <diskStore path="G:/ehcache/"/>  
      
      <!-- 默认cache:如果没有对应的特定区域的缓存,就使用默认缓存 --> 
      <!-- maxElementsInMemory为内存中缓存的最大对象数量,
      如果overflowToDisk为 true,缓存的内容有外溢,那么就会将外溢部份的数据写到指定的磁盘中 ,
      maxElementsOnDisk为磁盘上缓存的对象数量,默认为0表示不限制
      eternal为设定对象保存的永久属性,为true时表示永久,timeToLiveSeconds、timeToIdleSeconds失效
      timeToIdleSeconds对象多久没有被访问就会失效,单位秒
      timeToLiveSeconds为对象从创建到失效一共多长时间,单位秒
       diskSpoolBufferSizeMB 为diskStore使用的磁盘空间大小,默认30 mb-->
      
        <defaultCache maxElementsInMemory="10000"   
                    eternal="false"  
                    timeToIdleSeconds="300"   
                    timeToLiveSeconds="600" 
                    overflowToDisk="true"/>  
      <!-- 在类的映射文件指定区域cache:通过region指定某个类或集合二级缓存使用这个区块-->  
       <!-- 如:<cache usage="read-write" region="testCache"/> -->
       <!--如: <collection-cache region="testCache" usage="read-write" collection="com.restfullDemo.model.Department.users"/> -->
       <cache name="testCache"  
                    eternal="false"  
                    maxElementsInMemory="100" 
                    timeToIdleSeconds="1200"  
                    timeToLiveSeconds="1200"  
                    overflowToDisk="false">  
      </cache>   
    </ehcache> 

  4. 配置指定要使用二级缓存的方式有两种
    a) 在hibernate.cfg.xml中指定要使用二级缓存的类
    <!-- 类级二级缓存:指定哪些类要使用二级缓存 -->
      <class-cache usage="read-write" class="com.restfullDemo.model.User"/>
      <class-cache usage="read-write" class="com.restfullDemo.model.Department"/>
      <!-- 集合级二级缓存,指定哪个类中的集合属性使用二级缓级,前提是该属性的类必须已设置二级缓存中 -->
      <collection-cache usage="read-write" collection="com.restfullDemo.model.Department.users"/>

    b) 也可以在类的对应映射文件中时行配置
    ?

    类的二级缓存配置
    <class name="com.restfullDemo.model.User" table="t_user">
        <cache usage="read-write"/>
    ......
    </class>
    集合级的二级缓存配置
    <hibernate-mapping>
        <class name="com.restfullDemo.model.Department" table="t_department">
            <id name="id" type="int">
                <column name="id" />
                <generator class="assigned" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="name" />
            </property>
            <set name="users" table="t_user" inverse="false" lazy="false" >
            <cache usage="read-write"/>
                <key>
                    <column name="dpt_id" />
                </key>
                <one-to-many class="com.restfullDemo.model.User" />
            </set>
        </class>
    </hibernate-mapping>


    实例
    ?

    public class User {
    	private int id;
    	private String name;
    	private int age;
    	private Department dpt;
        setter、getter.....
    }
    public class Department {
    	private int id;
    	private String name;
    	private Set<User> users = new HashSet<User>();
    setter、getter......
    }

    hibernet.cfg.xml
    ?

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                             "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
     <session-factory name="">
      <property name="hibernate.dialect">xxxxx</property>
      <property name="hibernate.connection.driver_class">xxxx</property>
      <property name="hibernate.connection.url">xxxx</property>
      <property name="hibernate.connection.username">xxxx</property>
      <property name="hibernate.connection.password">123456</property>
      <property name="hibernate.show_sql">true</property>
      <property name="hibernate.format_sql">true</property>
      <property name="hibernate.hbm2ddl.auto">update</property>
      <!-- 缓存设置 -->
      <property name="hibernate.cache.use_second_level_cache">true</property>
      <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
      <!-- 映射文件配置 -->
      <mapping resource="com/restfullDemo/mappingResources/User.hbm.xml"/>
      <mapping resource="com/restfullDemo/mappingResources/Department.hbm.xml"/>
      <!-- 类级二级缓存:指定哪些类要使用二级缓存 -->
      <class-cache usage="read-write" class="com.restfullDemo.model.User"/>
      <class-cache usage="read-write" class="com.restfullDemo.model.Department"/>
      <!-- 集合级二级缓存,指定哪个类中的集合属性使用二级缓级,前提是该属性的类必须已设置二级缓存中 -->
      <collection-cache usage="read-write" collection="com.restfullDemo.model.Department.users"/>
     </session-factory>
    </hibernate-configuration>

    ?

查询缓存

查询缓存依赖于二级缓存,二级缓存没有开,查询缓存会失效,同理当设置完类级、集合集的二级缓存后,二级缓存没有开,在进行HQL的Query查询时,缓存也会失效,配置如下:
在hibernet.cfg.xml中添加

<!-- 缓存设置 -->
  <property name="hibernate.cache.use_second_level_cache">true</property>
  <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
 <!-- 开启查询二级缓存 -->
  <property name="hibernate.cache.use_query_cache">true</property>

在查询语句中开启查询缓存
?

public void getallUser() {
		String hql="from User";
		Query query=session.createQuery(hql);
		//开启查询缓存
        query.setCacheable(true);
		
		List<User> users1=query.list();
		System.out.println(Arrays.toString(users1.toArray()));
		List<User> users2=query.list();
		System.out.println(Arrays.toString(users2.toArray()));
	}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:40:46  更:2022-10-31 11:42:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 8:03:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码