Hibernate 之 二级缓存
在上篇文章中我们对缓存以及Hibernate的一级缓存进行了介绍,接下来的主要内容将是Hibernate的二级缓存.
二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享,换句话说就是一级缓存可以用二级缓存里的内容.二级缓存的生命周期和SessionFactory(重量级,一个数据库一个SessionFactory)的生命周期一致,SessionFactory可以管理二级缓存.
二级缓存在Hibernate中有自己的实现叫做HashTable,但是不建议用它进行商用,可以用来进行测试.Hibernate的二级缓存有专门的缓存策略提供商(Cache
Providers),例如EHCache,OSCache等.在这篇文章中我们主要介绍一下Hibernate二级缓存EHCache的用法.
二级缓存EHCache的配置和使用.
*将ehcache.xml文件拷贝到src下(在Hibernate3\etc\ehcache.xml路进行.从hibernate相关的例子中找配置文件)如下图:
默认配置.
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
配置的解释如下:
<!--缺省配置 可以对类进行单独配置-->
<!--最大对象数目 -->
<!--是否过期 -->
<!--多长时间没有被访问 -->
<!--如果超过限制,则放入磁盘中 -->
可以进行单独配置
<cache name="sampleCache2"
maxElementsInMemory="1000"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>
*在hibernate.cfg.xml文件中加入缓存产品提供商
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
* 启用二级缓存,这也是它的默认配置,在hibernate.cfg.xml配置文件中进行启动二级缓存配置.
<propertyname="hibernate.cache.use_second_level_cache">true</property>
*指定哪些实体类使用二级缓存
可以在映射文件中采用<cache>标签指定或在hibernate.cfg.xml文件中统一指定
注意使用的策略,通常采用read-only和read-write.
例如在配置文件中统一进行配置.(此处笔者将对Student类进行配置)
<class-cacheusage="read-only" class="com.tgb.hibernate.Student"/>
*以上便完成了EHCache的基本配置,接下来便是在具体的代码中运用
例如在两个Session中发Load查询,因为我们配置了二级缓存,所以在第二次Load的过程中不在发出查询语句,而是直接从二级缓存中获取数据.
测试代码如下:
- /**
- * 二级缓存测试代码
- *
- */
- public class CacheTest extends TestCase {
- /**
- * 开启二级缓存
- * 在两个session中发load查询
- */
- public void testCache() {
- Session session = null;
- try {
- //获取session
- session = HibernateUtils.getSession();
- //开启事务
- session.beginTransaction();
- //第一次用load查询id为1的学生
- Student student = (Student)session.load(Student.class, 1);
- System.out.println("student.name=" + student.getName());
- //提交
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- 第二次用load查询id为1的学生
- Student student = (Student)session.load(Student.class, 1);
- //不会发出查询语句,因为配置二级缓存,session可以共享二级缓存中的数据
- //二级缓存是进程级的缓存
- System.out.println("student.name=" + student.getName());
- session.getTransaction().commit();
- }catch(Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- }finally {
- HibernateUtils.closeSession(session);
- }
- }
- }
以上便是Hibernate二级缓存的EHCache产品的使用方式.当然二级缓存有着自己适用的场景.
适合存放到第二级缓存中的数据?
1很少被修改的数据
2不是很重要的数据,允许出现偶尔并发的数据
3不会被并发访问的数据
4参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。
不适合存放到第二级缓存的数据?
1经常被修改的数据
2财务数据,绝对不允许出现并发
3与其他应用共享的数据。
总结
缓存是为性能而生,但不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,在不了解原理的情况下乱用,可能会有N+1的问题。不当的使用还可能导致读出脏数据。
Hibernate 之 二级缓存的更多相关文章
- Hibernate之二级缓存
Hibernate之二级缓存 一.简介 Gaving King曾经对别人说,hibern ...
- hibernate(九) 二级缓存和事务级别详讲
序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...
- hibernate的二级缓存
缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数 ...
- 不要依赖hibernate的二级缓存
一.hibernate的二级缓存 如果开启了二级缓存,hibernate在执行任何一次查询的之后,都会把得到的结果集放到缓存中,缓存结构可以看作是一个hash table,key是数据库记录的id ...
- SSH整合缓存之-Memcached作为hibernate的二级缓存
Hibernate本身不提供二级缓存,所以需要使用第三方插件来作为二级缓存:本次使用memcached作为Hiberbate的二级缓存:添加步骤如下: 一.需要安装memcached服务端 1. 下载 ...
- Hibernate的二级缓存策略
Hibernate的二级缓存策略的一般过程如下: 1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次 ...
- Java面试题:Hibernate的二级缓存与Hibernate多表查询
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...
- Hibernate的二级缓存(SessionFaction的外置缓存)-----Helloword
1. 使用 Hibernate 二级缓存的步骤: 1). 加入二级缓存插件的 jar 包及配置文件: I. 复制 \hibernate-release-4.2.4.Final\lib\optional ...
- 介绍一下Hibernate的二级缓存
介绍一下Hibernate的二级缓存 按照以下思路来回答:(1)首先说清楚什么是缓存,(2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为什么还要有二级缓存,(3)最后再说 ...
随机推荐
- 第四讲:debugging simulation mismatches
关于竞争冒险: 1.use +race utility to locate race condition code **** 2.use $vcdplusdeltacycleon to locate ...
- Verilog仿真事件队列
1.分层的事件队列 2.执行事件的队列 3.仿真时间的计算 4.同一层事件,无先后顺序 这个点:觉得Verilog与systemVerilog比较,Verilog比较笼统,systemVerilog则 ...
- UART中RTS、CTS
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据. CTS (Clear ToSend,发送允许)为输入信号,用于 ...
- Python面向对象之异常
异常的概念 程序在运行时,如果python解释器遇见一个错误,就会停止程序的运行,并且提示一些错误信息,这就是异常: 程序遇见错误停止执行并且提示错误信息,这个动作我们称之为抛出(raise)异常: ...
- 使用pymysql 操作MySQL数据库
安装 pip install pymysql 注:连接前要有可使用的账户及有权限.可操作的数据库 先来一个栗子: import pymysql # 连接database conn = pymysql. ...
- coraldraw快捷键
显示导航窗口(Navigator window) [N] 运行 Visual Basic 应用程序的编辑器 [Alt]+[F11] 保存当前的图形 [Ctrl]+[S] 打开编辑文本对话框 ...
- 大数据学习——有两个海量日志文件存储在hdfs
有两个海量日志文件存储在hdfs上, 其中登陆日志格式:user,ip,time,oper(枚举值:1为上线,2为下线):访问之日格式为:ip,time,url,假设登陆日志中上下线信息完整,切同一上 ...
- jenkins在linux环境搭建-公司系统
1.按照这个搭建的项目https://www.cnblogs.com/zishengY/p/7170656.html 2.配置权限https://blog.csdn.net/mynameissls/a ...
- 【Ts 1】 maven初识
PS:本篇博客,就是对于maven的一个简单的总结,认识.可能更多的是借鉴别人的看法,然后结合自己的使用,再加以说明. 首先,什么是maven: Apache Maven is a software ...
- 如何解决安装istio后istioctl命令每次使用都需要重新配置路径
Kubernetes在安装istio后初次使用istioctl命令时会提示istioctl command not found 这时候如果在istio文件夹的根目录下配置 export PATH=$P ...