这篇主要讲 hibernate缓存

1.缓存的作用是为了提高效率

2.Hibernate的开发效率比较高,但是执行效率相对较低。

3.Hibernate提供了缓存来提高效率。hibernate缓存分为:一级缓存,二级缓存,查询缓存。

4.一级缓存又称为 session缓存,是线程级别的缓存。

get 和 load 方法查询数据 首先检查session缓存中是否有该数据,如果有,从缓存中直接获取数据,如果没有则查询数据库,并且写入缓存。

@Test
public void testGet(){
Session session = HibernateUtil.getSession();
Book b=(Book)session.get(Book.class, 1);
System.out.println(b.getName()+"---"+b.getAuthor());
b=(Book)session.get(Book.class, 1);
System.out.println(b.getName()+"---"+b.getAuthor());
}
@Test
public void testLoad(){
Session session = HibernateUtil.getSession();
Book b=(Book)session.load(Book.class, 1);
System.out.println(b.getName()+"---"+b.getAuthor());
b=(Book)session.load(Book.class, 1);
System.out.println(b.getName()+"---"+b.getAuthor());
}

在这两个方法中,第一次会执行sql语句查询,第二次则不会生成sql语句查询,直接从缓存中取数据了。

list方法查询数据,不会查看session缓存,直接从数据库中获取。list 查询数据后,会将数据写入 Session缓存。

@Test
public void testIterate(){
Session session = HibernateUtil.getSession();
Iterator<Book> iter = session.createQuery("from Book").iterate();
while(iter.hasNext()){
Book b = iter.next();
System.out.println(b.getName()+"---"+b.getAuthor());
}
System.out.println("==============================");
iter = session.createQuery("from Book").iterate();
while(iter.hasNext()){
Book b = iter.next();
System.out.println(b.getName()+"---"+b.getAuthor());
}
}

Session的管理:clear 清空缓存中数据,close 关闭, evict 清除指定对象

5.二级缓存又称为 SessionFactory缓存,是进程级别的缓存。声明周期很长。一般有缓存数据清理算法来清除缓存中的数据。

LRU ---最近最少使用,FIFO 、LFU 、LRU ;

6.二级缓存的实现步骤

  a). 导入 jar 包   --lib\optional\ehcache 下的所有包

    ehcache-core-2.4.3.jar

    hibernate-ehcache-4.3.10.Final.jar

    slf4j-api-1.6.1.jar

  b). 导入ehcache.xml 文件  project\etc 下的ehcache.xml 放入 src 下

<ehcache>

    <diskStore path="java.io.tmpdir"/>
<!-- maxElementsInMemory 最大存放元素个数
eternal 是否永久存储
timeToIdleSeconds 空闲秒数
timeToLiveSeconds 存活时间数
overflowToDisk 溢出是否写入磁盘
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/> </ehcache>

  c). 在映射文件 添加 cache 标签,指明使用二级缓存的方式

<hibernate-mapping package="cn.sxt.pojo">
<class name="Book" table="t_book">
<cache usage="read-only"/>
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<property name="author"/>
<property name="price"/>
<property name="pubDate"/>
<!-- 多对一的关联关系设置 column指定外键的名称 -->
<many-to-one name="category" column="cid" fetch="join"/>
</class>
</hibernate-mapping>

  d). 在 hibernate.cfg.xml 的通用配置中,开启二级缓存和 3.x 不一致

<!-- 开启二级缓存 -->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

  e)测试 –如果session被关闭后,数据只查询一次,那么二级缓存开启成功

@Test
public void testGet(){
Session session = HibernateUtil.getSession();
Book b=(Book)session.get(Book.class, 1);
System.out.println(b.getName()+"---"+b.getAuthor());
System.out.println("=========================");
HibernateUtil.close();
session = HibernateUtil.getSession();
b=(Book)session.get(Book.class, 1);
System.out.println(b.getName()+"---"+b.getAuthor());
}

7. 查询缓存,查询缓存是在二级缓存的基础上的。也就是首先要先开启二级缓存,查询缓存的配置,在hibernate.cfg.xml中添加通用配置

<!-- 开启查询缓存 -->
<property name="cache.use_query_cache">true</property>

在查询时需要指明使用查询缓存: 以下代码如果只查询一次,那么查询缓存设置成功

@Test
public void testList(){
Session session = HibernateUtil.getSession();
session.createQuery("from Book")
.setCacheable(true)//设置使用查询缓存
.list();
System.out.println("=================");
session.createQuery("from Book")
.setCacheable(true)//设置使用查询缓存
.list();
System.out.println("====================");
session.load(Book.class, 1);
}

java之hibernate之hibernate缓存的更多相关文章

  1. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  2. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  3. JAVA框架之Hibernate【Hibernate缓存详解】

    1.缓存介绍 Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理的,一般情况下无需进行干预:第二级别的缓 ...

  4. Hibernate的一级缓存

    Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...

  5. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  6. Hibernate学习之缓存机制

    转自:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N ...

  7. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

    hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...

  8. hibernate中的缓存问题与快照机制

    1.  什么是缓存 数据存储到数据库里面,数据库本身是一个文件系统,使用流方式操作文件(效率不高) 改进方式:把数据存到内存中,不需要使用流方式,可以直接读取内存中的数据 缓存:内存中的临时数据,当内 ...

  9. Hibernate之一级缓存和二级缓存

    1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...

随机推荐

  1. linux操作系统与jvm

    线程调度 https://www.cnblogs.com/xiaotlili/p/3510224.html

  2. 分析WordPress数据表之分类标签表(功能篇)

    数据表分析 wp_terms(分类标签表) 表字段如下:term_id(分类或标签ID)name(分类或标签名)slug(别名)term_group(分类标签组,我想应该是用于排序分组) wp_ter ...

  3. GlusterFS常用设置命令

    可信存储池(Trusted Storage Pool)创建存储池例如要创建一个包含3个服务器的存储池,则需要从第一个服务器server1中把另外两个服务器加入存储池中:# gluster peer p ...

  4. ppt使用记录之添加带圈的20以内的数字编号

  5. DNS域名解析失败 和 何时会查询下一个nameserver

    阿里DNS:域名解析失败的那些事:https://zhuanlan.zhihu.com/p/40659713 只有第一个nameserver响应超时,才会请求下一个nameserver. 收到 NOD ...

  6. wordpress 访问其他数据库

    有时候我们需要在 Worpdress 中访问其他服务器上的数据库时,可以使用以下方式,在 functions.php 中添加如下代码: // 输入数据库配置参数$mydb = new wpdb('us ...

  7. 微信支付:URL未注册问题

    起因:一个项目已经做好了,微信支付也调通的,域名 www.xxxx.com ,某天客户需要换域名,改为weixin.xxxx.com, 原先的www转向客户自己的官网,结果换了之后,发现微信支付出错: ...

  8. ospf的路由更新和撤销总结

    首先ospf 的报文有:hello报文,主要作用ospf 邻居建立及维护.dd报文,主要作用主从选举,序列号主从的确认,mtu的协商(可选).lsr 报文,主要作用向邻居请求lsa.lsu报文,主要作 ...

  9. Vue打包发布到Tomcat后,刷新报错404解决方法

    在应用下面加 WEB-INF 建 web.xml 内容如下 <?xml version="1.0" encoding="ISO-8859-1"?> ...

  10. 配置Pods和containers--为Containers和Pods分配CPU资源

    指定CPU请求和CPU限制 要为容器指定CPU请求,在容器资源清单中使用resources:requests字段.要指定CPU限制,使用resources:limits. cpu-request-li ...