【Hibernate】——缓存
来源:互联网 发布:网络币骗局 编辑:程序博客网 时间:2024/06/05 17:00
引言
hibernate是一个持久化框架爱,经常需要访问数据库。如果我们能够降低应用程序对物理数据库访问的次
数,那会提升应用程序的运行性能。缓存内的书库是物理数据源中的数据的赋值,应用程序运行时先从缓存中读
取数据。
缓存就是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拷贝,位于数据库和数据库访
问层中间。ORM在查询数据时首先会根据自身的缓存管理策略,在缓存中查找相关的数据,如发现所需的数据,
则直接将此数据作为结果加以利用,从而避免了数据库调用性能的开销。而相对内存操作而言,数据库调用是一
个代价高昂的过程。这里就引入了缓存的概念。
这里主要讲hibernate的缓存,它分为两大类:一级缓存和二级缓存,下边分别讲讲什么是hibernate的一级
缓存和二级缓存。
Hibernate一级缓存
hibernate的一级缓存,又被称为session级缓存(或事务级缓存),生命周期很短,session提交了,缓存就
结束了。session缓存是内置的,不能为卸载,是事务范围的缓存。在一级缓存中,持久化类(Persistent)的每个
实例都具有唯一的OID。
看一个简单的保存班级学生的例子:
public static void main(String[] args) { Session session = null; try { session = HibernateUtils.getSession(); session.getTransaction().begin(); for(int i = 0; i<10; i++){ Class class1 = new Class(); class1.setName("班级" + i); session.save(class1); for(int j=0; j<10; j++ ){ Student students = new Student(); students.setName("班级" + i + "的学生" + i); session.save(students); } } session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally{ HibernateUtils.closeSession(session); } }当session.save()时,对象由Transient状态编程Persistent状态;当 session.getTransaction().commit()保存到数
据库;当HibernateUtils.closeSession(session)时,session的声明周期结束,也就是一级缓存结束。
Hibernate二级缓存
hibernate二级缓存又被称为SessionFactory级缓存。由于SessionFactory对象的生命周期和应用程序的整个过
程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发
访问策略,该策略为被缓存的数据提供了事务隔离级别。第二级缓存是可选的,是一个可配置的插件,默认下
SessionFactory不会启用这个插件。
启用二级缓存需要再配置文件hibernate.cfg.xml里配置:
<!-- 配置缓存提供商 --><property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property><!-- 启用二级缓存,这也是它的默认配置 --><property name="hibernate.cache.use_second_level_cache">true</property>并引入ehcache.xml文件。
一个简单的例子,看一级缓存与二级缓存如何交互:
/** * 开启二级缓存 * * 一级缓存和二级缓存的交互 */public void testCache4() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();//禁止将一级缓存中的数据放到二级缓存中session.setCacheMode(CacheMode.IGNORE);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();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);}}
什么样的数据适合放入到缓存中?
1、很少被修改的数据
2、不是很重要的数据,允许出现偶尔并发的数据
3、不会被并发访问的数据
4、常量数据
什么样的数据不适合放入到缓存中?
1、经常被修改的数据
2、绝对不允许出现并发访问的数据,如财务数据。
3、与其他应用共享的数据
总结
总的来说,session缓存又三大作用:1、减少访问数据库的频率。应用程序从缓存中读取持久化对象的速度
显然比到数据库中查询数据的速度快多了,因此session的缓存可以提供数据访问的性能。2、当缓存中的持久化对
象之间存在循环关联关系时,session会保证不出现访问对象的死循环,以及由死循环引起的JVM堆栈溢出异常。
3、保证数据库中的相关记录与缓存中的相应对象保持同步。
- Hibernate——缓存
- Hibernate——缓存
- 【Hibernate】——缓存
- 【Hibernate】——缓存
- Hibernate缓存——查询缓存
- 精通Hibernate——Hibernate缓存详解
- Hibernate——一级缓存
- Hibernate——缓存管理
- Hibernate——session缓存
- Hibernate——一级缓存__二级缓存__查询缓存
- hibernate 缓存——数据持久化
- hibernate缓存机制——尚学堂
- Hibernate(四)——缓存策略+lazy
- 菜鸟学习Hibernate——缓存
- Hibernate(四)——缓存策略+lazy
- 精通Hibernate——理解HibernateSession缓存
- Hibernate——缓存+如何配置二级缓存
- Hibernate框架——缓存(1)
- RecyclerView(基础篇一)
- PYQT5 编程第一例
- 网络流24题13. 星际转移问题
- Error Installing APK
- 杭电oj---2003 求绝对值
- 【Hibernate】——缓存
- PHP及其微信公众号开发(学习之路四)
- 我这个人
- hdu 3652 B-number (数位DP)
- 浏览器-解决火狐浏览器总是提示Adobe Flash更新的问题
- KMP算法NEXT数组计算方法
- Java assert
- linux的诞生和发展
- Qt实现读取Excel表,并将读取的信息写进word文档中