java之hibernate之hibernate缓存
这篇主要讲 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缓存的更多相关文章
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- Java面试题:Hibernate的二级缓存与Hibernate多表查询
我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...
- JAVA框架之Hibernate【Hibernate缓存详解】
1.缓存介绍 Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存.这一级别的缓存由hibernate管理的,一般情况下无需进行干预:第二级别的缓 ...
- Hibernate的一级缓存
Hibernate的一级缓存 什么是缓存:缓存将数据库/硬盘上文件中数据,放入到缓存中(就是内存中一块空间).当再次使用的使用,可以直接从内存中获取 缓存的好处:提升程序运行的效率.缓存技术是Hibe ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结
我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...
- Hibernate学习之缓存机制
转自:http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N ...
- JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)
hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...
- hibernate中的缓存问题与快照机制
1. 什么是缓存 数据存储到数据库里面,数据库本身是一个文件系统,使用流方式操作文件(效率不高) 改进方式:把数据存到内存中,不需要使用流方式,可以直接读取内存中的数据 缓存:内存中的临时数据,当内 ...
- Hibernate之一级缓存和二级缓存
1:Hibernate的一级缓存: 1.1:使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...
随机推荐
- Shell字符串截取(非常详细)
假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 1 echo ${var#*//} 其中 var 是变量名,# 号是运算符, ...
- 数位dp技巧
一个奇怪的东西 正反都能dp!: 正常我们数位dp都是从高到低,以这样的方式保证其小于给定数-> ll n; int num[N],l; ll dp[]; ll dfs(int p,int li ...
- java复制对象之深拷背
在java开发中,有时我们需要复制对象,并且确保修改复制得到的对象不会影响原来的对象. 于是,有些人可能会写出类似以下的代码: public class CloneTest { public stat ...
- 冰多多团队-第八次Scrum例会
冰多多团队-第八次Scrum会议 工作情况 团队成员 已完成任务 待完成任务 zpj debug, IAT debug, IAT 牛雅哲 将语音部分迁移到IatDemo上,去将科大讯飞的语音听写dem ...
- web页面引入字体
一.常见web字体 TrueType (.ttf) Windows和Mac系统最常用的字体格式,其最大的特点就是它是由一种数学模式来进行定义的基于轮廓技术的字体,这使得它们比基于矢量的字体更容易处理, ...
- 【转载】 TensorFlow函数:tf.Session()和tf.Session().as_default()的区别
原文地址: https://blog.csdn.net/Enchanted_ZhouH/article/details/77571939 ------------------------------- ...
- Python3基础 内置函数 dir 查询对象的方法列表
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- QC9.2登陆时显示一个X号
这个是因为浏览器安全设置的问题,具体解决步骤如下: 进入“工具-Internet选项”设置窗口,进入“高级”选项卡,将“安全”设置中的“启用内存保护减少联机攻击”选项的勾选去掉,然后应用并确定.重启浏 ...
- 带有Q_OBJECT的类要放在头文件的第一个类位置,否则可能无法moc
如果头文件中有多个类,带有Q_OBJECT的类要放在头文件的第一个类位置,否则可能无法moc
- 阶段一-01.万丈高楼,地基首要-第2章 单体架构设计与准备工作-2-27 为何不使用@EnableTransactionManagement就能使用事务?
使用了注解使用事务.但是没有开启注解的启用 启动类里面使用注解 @EnableTransactionManager开启事物的管理. 为什么我们没有开启这个注解,还需要在响应的Service里面使用事务 ...