hibernate的一级和二级缓存
一级缓存就是Session级别的缓存,close后就没了。
二级缓存就是SessionFactory级别的缓存,全局缓存,要配置其他插件。
什么样的数据适合存放到第二级缓存中?
1、很少被修改的数据
2、不是很重要的数据,允许出现偶尔并发的数据
3、不会被并发访问的数据
4、参考数据
不适合存放到第二级缓存的数据?
1、经常被修改的数据
2、财务数据,绝对不允许出现并发
3、与其他应用共享的数据。
Hibernate的二级缓存策略的一般过程如下:
1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。
2) 把获得的所有数据对象根据ID放入到第二级缓存中。
3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。
4) 删除、更新、增加数据的时候,同时更新缓存。
配置2级缓存
Hibernate有很多值得学习的地方,这里我们主要介绍配置Hibernate二级缓存,包括介绍在Spring托管的Hibernate二级缓存等方面。
使用EhCache配置Hibernate二级缓存:
配置Hibernatee二级缓存准备:
1)把ehcache-1.2.3.jar加入到当前应用的classpath中。
2)在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。
- <property name="hibernate.cache.provider_class">
- org.hibernate.cache.EhCacheProvider
- </property>
3)挎贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下。
- <?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="org.qiujy.domain.cachedemo.Category" table="categories">
- //配置缓存,必须紧跟在class元素后面对缓存中的Category对象采用读写型的并发访问策略
- <cache usage="read-write"/>
- <id name="id" type="java.lang.Long">
- <column name="id" />
- <generator class="native" />
- </id>
- <!-- 配置版本号,必须紧跟在id元素后面 -->
- <version name="version" column="version" type="java.lang.Long" />
- <property name="name" type="java.lang.String">
- <column name="name" length="32" not-null="true"/>
- </property>
- <property name="description" type="java.lang.String">
- <column name="description" length="255"/>
- </property>
- <set name="products" table="products" cascade="all" inverse="true">
- <cache usage="read-write"/>
- <key column="categoryId" not-null="true"/>
- <one-to-many class="org.qiujy.domain.cachedemo.Product"/>
- </set>
- </class>
- </hibernate-mapping>
Product.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="org.qiujy.domain.cachedemo.Product" table="products">
- <cache usage="read-write"/>
- <id name="id" type="java.lang.Long">
- <column name="id" />
- <generator class="native" />
- </id>
- <!-- 配置版本号,必须紧跟在id元素后面 -->
- <version name="version" column="version" type="java.lang.Long" />
- <property name="name" type="java.lang.String">
- <column name="name" length="32" not-null="true"/>
- </property>
- <property name="description" type="java.lang.String">
- <column name="description" length="255"/>
- </property>
- <property name="unitCost" type="java.lang.Double">
- <column name="unitCost" />
- </property>
- <property name="pubTime" type="java.util.Date">
- <column name="pubTime" not-null="true" />
- </property>
- <many-to-one name="category"
- column="categoryId"
- class="org.qiujy.domain.cachedemo.Category"
- cascade="save-update"
- not-null="true">
- </many-to-one>
- </class>
- </hibernate-mapping>
编辑ehcache.xml文件:
- <ehcache>
- <diskStore path="c:\\ehcache\"/>
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- />
- <!-- 设置Category类的缓存的数据过期策略 -->
- <cache name="org.qiujy.domain.cachedemo.Category"
- maxElementsInMemory="100"
- eternal="true"
- timeToIdleSeconds="0"
- timeToLiveSeconds="0"
- overflowToDisk="false"
- />
- <!-- 设置Category类的products集合的缓存的数据过期策略 -->
- <cache name="org.qiujy.domain.cachedemo.Category.products"
- maxElementsInMemory="500"
- eternal="false"
- timeToIdleSeconds="300"
- timeToLiveSeconds="600"
- overflowToDisk="true"
- />
- <cache name="org.qiujy.domain.cachedemo.Product"
- maxElementsInMemory="500"
- eternal="false"
- timeToIdleSeconds="300"
- timeToLiveSeconds="600"
- overflowToDisk="true"
- />
- </ehcache>
在Spring托管的Hibernate二级缓存
1.在spring的配置文件中,hibernate部分加入 xml 代码 org.hibernate.cache.EhCacheProvider true
2.为HBM表设置cache策略 xml 代码
3.在DAO中,调用find方法查询之前,设置使用缓存 Java代码 getHibernateTemplate().setCacheQueries(true);
补充:
如果不设置“查询缓存”,那么Hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、
Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置
hibernate.cache.use_query_cache true 才行。
hibernate的一级和二级缓存的更多相关文章
- Hibernate的查询,二级缓存,连接池
Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...
- hibernate框架学习之二级缓存
缓存的意义 l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取.缓存是介于应用程序与永久性存储介质之间的一块数据存储区域.利用缓存,应用程序可以将使用的数 ...
- Mybatis一级、二级缓存
Mybatis一级.二级缓存 一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...
- hibernate框架学习之二级缓存(测试用例)
HqlDemoApp.java package cn.itcast.h3.query.hql; import java.io.Serializable; import org.hibernate.Qu ...
- Hibernate 性能优化之二级缓存
二级缓存是一个共享缓存,在二级缓存中存放的数据是共享数据特性 修改不能特别频繁 数据可以公开二级缓存在sessionFactory中,因为sessionFactory本身是线程安全,所 ...
- MyBatis 一级、二级缓存
一级 默认session就有一级缓存,session有C/U/D操作或者session.clearCache();session.commit();都会清空缓存: 二级在mapper.xml中添加&l ...
- mybatis学习--缓存(一级和二级缓存)
声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...
- 【mybatis源码学习】mybtias一级,二级缓存
转载:https://www.cnblogs.com/ysocean/p/7342498.html mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSessi ...
- Hibernate 集成 Ehcache 开启二级缓存
一.将 Ehcache.xml 放到 classpath 下 <?xml version="1.0" encoding="UTF-8"?> < ...
随机推荐
- freemarker处理哈希表的内建函数
freemarker处理哈希表的内建函数 1.简易说明 (1)map取值 (2)key取值 2.实现示例 <html> <head> <meta http-equiv=& ...
- hdu5937 Equation
题解其实网上有 突然有点感想 为什么可以用搜索或状压,因为方案数很有限,它要求每种方案不同就意味着搜索的次数也一定,所以现在就应该坚定往这方面想,找部分方案的贪心.这和上一题一样,都是先暴力,后面处理 ...
- 异常-----spring明明注入了Service到Action中,为什么运行的时候Service为空,在抽象类中,有子类来继承的
xml的配置文件 <bean id="fftController" class="com.bill99.query.controller.FftController ...
- val(),text(),html()的区别
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> ...
- 【CJOJ1603】【洛谷1220】关路灯
题面 Description 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老常就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉 ...
- 【BZOJ2152】聪聪可可(点分治)
[BZOJ2152]聪聪可可(点分治) 题面 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电 ...
- Spring AOP梳理
一.Srping AOP AOP(Aspect Oriented Programming)解释为面向切面编程,何为切面,用刀把一块面包切成两半,刀切下去形成的面就叫切面,那么面向切面的就是形成切面的这 ...
- Python中装饰器的用法
定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ...
- linux下debug工具
在linux下开发难免会遇到bug,但是由于没有图形IDE,导致debug也变得困难,其实只要掌握一些常用的debug工具,一些错误就能很快解决,本文就介绍一些常用的工具用以调试: log 输出log ...
- lambda表达式Expression<Func<Person, bool>> 、Func<Person, bool>区别
前言: 自己通过lambda表达式的封装,将对应的表达式转成字符串的过程中,对lambda表达式有了新的认识 原因: 很多开发者对lambda表达式Expression<Func<Pers ...