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的执行效率:(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据 ...
随机推荐
- ln -s 使用
最近开发项目中遇到一个问题,网站上传文件到项目根目录下的upload文件夹,但是每次项目发布都会把upload文件夹删除掉,所以我们需要把upload文件夹放在系统目录下而不是项目根目录下. 访问的时 ...
- 微信小程序之上传图片(含前后端代码例子)
此代码示例,能够让你成功将图片上传至后端,后端做相应的处理,然后返回成功码. 前端小程序代码 index.wxml: <view class='content'> <view cla ...
- list删除、集合遍历删除
public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); li ...
- keepalived haproxy 主备配置
global_defs { router_id k8s_master} vrrp_script chk_http_port {script "/etc/keepalived/check_ha ...
- jQuery实现列表框双向选择操作
对列表框的操作经常碰到过这样的应用:从左侧的列表框中选中要选的项添加到右侧列表框中,然后提交最终选择的项,对误操作而选中的项还可以执行移除操作.在很多系统中应用比如说求职网站的选择意向工作地区,QQ好 ...
- 微信小程序支付接口之Django后台
本文链接:https://blog.csdn.net/qq_41860162/article/details/89098694Python3-django-微信小程序支付接口调用工具类生成一系列微信官 ...
- docker swarm 集群搭建
创建一个集群 [vagrant@node1 ~]$ docker swarm init --advertise-addr 192.168.9.101 Swarm initialized: curren ...
- NodeJS包管理器之Yarn
一.安装yarn 首选必须先安装好NodeJS,之后可以去yarn官网下载mis安装程序安装.由于NodeJS自带了一个包管理器npm,所以安装yarn更简单的方法是直接使用npm install - ...
- android 8.1 wifi提示"已连接 但无法访问互联网"的解决办法
主要是GFW的问题 adb shell以下命令解决 settings put settings put settings put settings put global captive_portal_ ...
- Python3基础 is与== 区别
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...