《零点起飞学Java Web开发之Hibernate事务处理和缓存管理.pptx》由会员分享,可在线阅读,更多相关《零点起飞学Java Web开发之Hibernate事务处理和缓存管理.pptx(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第16章 Hibernate事务处理和缓存管理Hibernate提供了进行数据库事务处理、并发事务控制、缓存管理的方法。事务处理和缓存管理对于高效率地使用数据库是非常重要的。通过本章的学习,读者可以了解事务、并发事务的概念,以及如何使用Hibernate管理事务,如何管理Hibernate的缓存,从而在实际开发中很好地优化Hibernate的性能。16.1 Hibernate的事务处理数据库事务是一个或者多个SQL语句组成的工作单元。如果有一个SQL语句执行失败,就必须撤销整个工作单元。在并发环境中,多个事务同时访问相同的数据资源,这样就可能造成各种并发问题。这时可以通过设置数据库系统的事务隔
2、离级别来避免各种并发问题。此外,在应用悲观锁来解决数据丢失这一并发问题。对于事务处理,Hibernate有自己进行事务处理的方法,本节通过实例来进行讲解。16.1.1 什么是数据库事务下面介绍数据库事务的概念,以及它的特征。1事务的概念事务是数据库操作中一个最小的执行单元,它由一组相互依赖的操作行为组成。例如,由查询和更新两个操作行为构成一个事务。事务的成功与否取决于这些操作行为是否都能执行成功。只要有一个操作行为执行失败,那么整个事务执行失败。这时必须回滚到事务执行前的状态。2事务的特性数据库事务必须具有ACID特征,ACID是Atomic(原子性)、Consistency(一致性)、Iso
3、lation(隔离性)和Durability(持久性)的英文缩写。下面解释这4个概念。原子性:是指整个数据库事务是一个不可分割的工作单元。一致性:是指事务不能破坏关系数据的完整性和业务逻辑上的一致性。隔离性:事务的隔离性要求事务访问的任何数据不会受到其他事务所做的任何改变的影响,直到该事务完成。持久性:是指只要事务成功结束,它对数据库所做的操作必须永久保存下来。即使系统发生崩溃,重新启动系统后,数据库还能恢复到事务成功结束时的状态。16.1.2 数据库的隔离级别数据库的锁机制可以保证事务的隔离性,避免多个事务同时对同一资源进行操作。但是当锁的数目太多时,会影响数据库的并发性能。并发性能是指数据
4、库系统同时给各种访问者提供服务的能力。例如,当一个事务锁定某一个资源时,其他的事务必须停下来等待,这样就降低了数据库相应多个请求的速度。所以,为了能让用户根据实际需求,在事务的隔离性和并发性之间做出合理的权衡,数据库系统提供了4种事务隔离的级别供用户选择。1Serializable(串行化)当数据库采用该级别进行隔离时,一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。当两个事务同时访问同一资源时,如果一个事务已经开始访问该资源,则另一个事务必须停下来等待,直到前一个事务结束。2Repeatable Read(可重复读)当数据库采用这个级别进行隔离时,一个事务在执行的过程中可以看到其
5、他事务已经提交的新插入的记录,但是看不到其他事务对已有记录的更新。3Read Committed(读已提交数据)当数据库采用该隔离级别时,一个事务在执行的过程中可以看到其他事务已经提交的新插入的记录,并且可以看到其他事务已经提交的对已有记录的更改。4Read Uncommitted(读未提交数据)当数据库采用该级别进行隔离时,一个事务在执行的过程中可以看到其他事务没有提交的新插入的记录,而且可以看到其他事务没有提交的对已有记录的更新。16.1.3 了解Hibernate中的事务处理Hibernate封装了JDBC API和JTA API,提供专门进行事务管理的类Transaction。使用它可
6、以对事务进行管理。尽管程序员可以直接使用JDBC API进行事务管理,但是这样不利于进行跨平台开发。因而应该优先考虑使用Hibernate提供的API进行事务管理。16.1.4 并发控制在并发环境中,一个数据库系统可能同时受到多个客户程序的访问。这些客户程序可能是数据库服务器的客户端、Java应用程序、也可能是Java应用程序中的不同线程。对于同时运行的多个事务,如果没有采用最高级别的隔离机制Serializable,而是使用低级的隔离机制,则可能会导致各种并发问题。16.2 管理Hibernate缓存Hibernate有二级缓存结构。session缓存是内置的,被称为Hibernate的一级
7、缓存;SessionFactory的外置缓存是可以插拔的缓存插件,它被称为Hibernate的二级缓存。Hibernate使用缓存策略去实现持久化对象和数据库的同步更新,并且缓存可以很大程度上提升查询的速度。本节先介绍缓存的基本原理,然后分别讲解如何使用Hibernate的二级缓存。16.2.1 缓存的基本原理缓存的概念在计算机领域非常常见,它介于应用程序和永久性数据(如硬盘文件、数据库)之间。它可以降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能。缓存中的数据通常是持久化类的实例,例如JavaBean实例,它按照较低的频率和数据存储源进行同步,用来持久化被应用程序修改的数据
8、,获取应用程序需要但缓存中没有的数据。应用程序和缓存之间可以进行高频率的数据交换,应用程序可以从缓存中查询数据,并且修改它们。缓存的物理介质是内存,而永久性数据存储源的物理介质通常是硬盘或者磁盘。应用程序直接读取内存的速度显然比读取硬盘的速度要快。1缓存的范围缓存的范围决定了缓存的生命周期以及它可以被谁访问。2缓存的并发访问策略16.1节已经介绍过,当并发事务同时访问数据库中相同的数据时,可能会出现很多问题,所以必须根据需要采用不同级别的事务隔离措施。同样,当多个事务同时访问持久化层的缓存时,也可能会出现各种并发事务问题。事务范围的缓存被一个事务所独有,所以不会出现并发问题。但是进程范围、群集
9、范围的缓存被多个事务所共享,它们在同一时刻,可能会被多个事务共同访问,所以必须采用并发访问策略。根据隔离级别的不同,可以分为如下所示的4种。事务型。读写型。非严格读写性。只读型。16.2.2 Hibernate的二级缓存结构第一级缓存是session对象的缓存。由于session对象的生命周期通常对应于一个数据库事务,因而它是事务范围的缓存。这一级缓存是必须的,程序员无法将它卸除。在这一级缓存中不仅保存类的实例,还保存实例之间关系。每个实例的id属性都不为空。第二级缓存是一个可以插拔的缓存插件,它有SessionFactory控制。由于SessionFactory的生命周期和整个进程相对应,因
10、而该缓存是进程范围或群集范围的。该缓存被多个事务所共享,所以可能会出现并发问题,必须为其设置并发访问策略。Hibernate使用缓存适配器(Cache Provider)把缓存实现软件和Hibernate集成,有多种缓存实现软件,程序员可以根据需要去选择。16.2.3 管理Hibernate的第一级缓存第一级缓存存储了和session对象相关的持久化层(JavaBean)实例。当应用程序调用session的save()、update()、saveOrUpdate()、load()、get()等方法时,如果session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一缓存中。当
11、调用flush()或其他方法来清理缓存时,Hibernate把缓存中JavaBean对象状态的变化同步更新到数据库中。Hibernate提供了如下两个管理该缓存的方法。evict(Object obj):从缓存中清除参数obj指定的持久化对象。clear():清空缓存中所有的持久化对象。一般情况下,当不希望session继续根据某个对象状态的变化来同步更新数据库时,可以使用evict()把该对象从该缓存中清除。这样,这个对象就变成了游离状态的了。Hibernate不会把它的变化存入数据库。下面通过一个例子来讲解。16.2.4 管理Hibernate的第二级缓存Hibernate的第二级缓存由插
12、件去实现,它们都是由第三方提供,常见的缓存插件有下面几种。EHCache。OpenSymphony。SwarmCache。JBossCache。Hibernate提供了CacheProvider接口,它是缓存插件和Hibernate之间的适配器。跟上面的插件对应的适配器分别是以下几种。org.hibernate.cahce.EhCacheProvider:EHCache插件适配器org.hibernate.cahce.OSCacheProvider:OpenSymphony插件适配器org.hibernate.cahce.SwarmCacheProvider:SwarmCache插件适配器org.hibernate.cahce.TreeCacheProvider:JBossCache插件适配器16.3 小 结本章结合实例讲解了Hibernate事务处理的方式、并发事务的控制,以及如何使用Hibernate的二级缓存机制。其中重点是要掌握如何使用Hibernate进行事务管理和缓存管理,并且能够在实际应用中去优化Hibernate的性能。通过本章讲解的基本概念和所举的例子,相信读者应该可以掌握这部分内容。