当前位置:首页>开发>正文

怎样关闭hibernate3.0的二级缓存 怎么开启hibernate的缓存

2023-04-20 02:31:03 互联网 未知 开发

 怎样关闭hibernate3.0的二级缓存 怎么开启hibernate的缓存

怎样关闭hibernate3.0的二级缓存

:因为应用程序访问数据库,读写数据的代价非常高,而利用持久层的缓存可以减少应用程序与数据库之间的交互,即把访问过的数据保存到缓存中,应用程序
再次访问已经访问过的数据,这些数据就可以从缓存中获取,而不必再从数据库中获取。同时如果数据库中的数据被修改或者删除,那么是、该数据所对应的缓存数
据,也会被同步修改或删除,进而保持缓存数据的一致性。

怎么开启hibernate的缓存

1 缓存的概念,以及用途
1) 缓存:(hibernate单独用来保存数据,开辟一块内存)
缓存就是数据库中的数据在内存中的临时的容器,包含
了数据库表中的数据,位于数据库和访问层之间
2)缓存优点: hibernate做查询的时候,首先去缓存中
查询要找的数据,有直接使用,没有再发sql语句去数据库
中真实查询
把用户经常访问的数据,放入缓存当中,这样每次
就不需要去数据库中访问这些常用信息,可以提高系统的
性能。
3)缓存的分类:
a) 一级缓存
b) 二级缓存
c) 查询缓存

2 一级缓存
1)内部结构:一级缓存的内部结构就是一个map
map的key就是id,map的value就是实体对象,该结构
导致一级缓存不能缓存属性
2)一级缓存的生命周期:
一级缓存的生命周期与session有关,session创建并
维护一级缓存,session关闭,一级缓存销毁
3)hibernate中API使用缓存:
a) 可以读写一级缓存的: get , load,Iterate
b) 可以写入一级缓存的: save ,list
4)hibernate一级缓存无法禁用:
5)一级缓存的管理:session管理一级缓存(把一级缓存
数据清空clear)

3 二级缓存
1)二级缓存也叫进程级缓存或SessionFactory级缓存,
二级缓存可以让所有的session所共享
2)二级缓存的生命周期跟SessionFactory一致,
SessionFactory管理二级缓存
3)二级缓存的结构是Hashtable,只能保持实体对象,
不能保存属性,开发当中需要使用第3方提供的缓存组件
4)ehcache.xml
//在该二级缓存中,最多可以缓存对象的数量
maxElementsInMemory="1000"
//缓存在二级缓存中的对象是否永远都有效,一般配置为false
eternal="true"
//"钝化":两次访问该二级缓存中对象的,间隔时间
timeToIdleSeconds="120"
//二级缓存中的对象从创建到消亡的时间
timeToLiveSeconds="120"
//如果超过缓存的访问,可以写入到硬盘上的
overflowToDisk="true"
5)如何使用二级缓存
a)导入第3方ehcache-1.2.3.jar
b)导入ehcache.xml 配置文件,放入src目录下
c)修改hibernate.cfg.xml
(一)指明二级缓存的提供商


org.hibernate.cache.EhCacheProvider

(二)开启二级缓存

true
d)指明那个对象放入二级缓存中


6) 使用二级缓存
能够读写二级缓存: get load iterate
能够写入而不能读取二级缓存: list
7) 二级缓存的管理
使用SessionFactory来管理我们的二级缓存
首先修改HibernateUtil,添加获得SessionFactory的方法
SessionFactory factory = HibernateUtil2.getSessionFactory()
//factory.evict(Student.class, 1):去掉二级缓存中
//id为1的student对象
//factory.evict(Student.class,1)
//factory.evict(Student.class):去掉二级缓存中所有的
//student对象

4 查询缓存
1)查询用来保存属性的,对实体对象的结果集只保存id
2)查询缓存的生命周期,只有当前的表发生改变,查询
缓存的生命周期结束
3)如何使用查询缓存:
a)修改hibernate.cfg.xml文件,开启查询缓存

true
b)在Query对象中必须手动开启查询缓存

hibernatetemplate怎么清空缓存

关于为何要使用HibernateTemplate.clear()
一:
session.clear()的运用,尤其在不断分页循环的时候,例如
a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象
b)另外一种形式的内存泄露 (语法级别没有 但是可由java引起)
无论是load还是get,都会首先査找缓存(一级缓存),如果没有,才会去数据库査找,调用
clear()方法可以强制清除session缓存。
二:
在Session接口的实现类中包含一系列的java集合,这些java集合构成了Session的缓存,只要Session实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期(没有结束生命周期就意味着一直占用内存)。
当Session的save()方法持久化一个对象时,对象被加入到Session的缓存中,以后即使应用程序中的变量不再引用对象,只要Session的缓存还没有被清空,对象仍然处于生命周期中。
当Session的get()方法试图从数据库中加载一个对象时。Session先判断缓存中是否已经存在这个对象,如果存在,就不需要在到数据库中检索,而直接从缓存中获得这个对象。

Session缓存的作用:
(1)、减少访问数据库的频率。应用程序从缓存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,因此Session缓存可以提高数据访问的性能。
(2)、当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象的死循环,以及由死循环引起的jvm堆栈溢出异常。
(3)、保证数据库中的相关记录与缓存中的相应对象保持同步。

hibernate中session的缓存怎么清除

1. 清空缓存
当调用session.evict(customer) 或者session.clear() 或者session.close()方法时,Session的缓存被清空。

2. 清理缓存
Session具有一个缓存,位于缓存中的对象处于持久化状态,它和数据库中的相关记录对应,Session能够在某些时间点,按照缓存中持久化对象的属性变化来同步更新数据库,这一过程被称为清理缓存。

在默认情况下,Session会在下面的时间点清理缓存。

当应用程序调用org.hibernate.Transaction的commit()方法的时候,commit()方法先清理缓存,然后在向数据库提交事务;
当应用程序调用Session的list()或者iterate()时(【注】get()和load()方法不行),如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能能反映持久化对象的最新状态;
当应用程序显式调用Session的flush()方法的时候。

hibernate 一二级缓存问题

一级缓存就是把通过session查询的数据保存到该session对象中,下次再查询时直接可以从这个session中先查找,如果有就不去查数据库了,但要求这个session不能关闭,如果关闭,则缓存自动销毁.

二级缓存是sessionFactory的缓存,需要单独加入第三方的支持,一般都使用ehcache或oscache.
二级缓存设置后可以把所有通过该sessionFactory来查询的数据保存到内存中(保存的数量可以配置,如果超出范围还可以设置保存到硬盘上),当再次查询时会先从缓存中查找,如果有就不会再从数据库中查询. 如果sessionFactory关闭或销毁,则缓存中的数据也会销毁.
一般开发中会将sessionFactory设置为单例,这样可以使用二级缓存.

最新文章