《第13章 Hibernate的事务处理、缓存及性能优化ppt课件.ppt》由会员分享,可在线阅读,更多相关《第13章 Hibernate的事务处理、缓存及性能优化ppt课件.ppt(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第13章章 Hibernate的事务处理、缓存及的事务处理、缓存及性能优化性能优化第十三章第十三章Hibernate的事务处理、缓存的事务处理、缓存及性能优化及性能优化事务处理事务处理 n什么是事务什么是事务v所谓事务,是指这样一个操作序列,这些操作要么都执行,要么都所谓事务,是指这样一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。不执行,是一个不可分割的工作单位。v事务是数据库维护数据一致性的单位,在每个事务结束时,都能保事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。持数据一致性。 事务处理事务处理 n事务具有以下基本特征:事务具有以下基
2、本特征:vAtomic(原子性):事务中包含的操作被看作一个逻辑单元,这个(原子性):事务中包含的操作被看作一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败;逻辑单元中的操作要么全部成功,要么全部失败;vIsolation(隔离性):事务允许多个用户对同一个数据进行并发访(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立;与其他并行事务的修改相互独立;vDurability(持久性):事务结束后,事务处理的结果必须能够得(持久性):事务结束
3、后,事务处理的结果必须能够得到固化;到固化;vConsistency(一致性):只有合法的数据可以被写入数据库,否(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。则事务应该将其回滚到最初状态。Hibernate中的事务处理中的事务处理 nHibernate事务的本质事务的本质vHibernate是是JDBC的轻量级封装,本身并不具备事务管的轻量级封装,本身并不具备事务管理能力。在事务管理层,理能力。在事务管理层,Hibernate将其委托给底层的将其委托给底层的JDBC或者或者JTA,以实现事务管理和调度功能。,以实现事务管理和调度功能。Hibernate的默认事务
4、处理机制基于的默认事务处理机制基于JDBC TransactionHibernate中的事务处理中的事务处理 nHibernate处理事务的流程处理事务的流程 v对于使用对于使用Hibernate实现持久化功能的系统来说,事务的实现持久化功能的系统来说,事务的处理是这样的:处理是这样的:服务器端在接收到用户的请求后,会创建一个新的服务器端在接收到用户的请求后,会创建一个新的Hibernate Session对对象对对象然后通过该然后通过该Session对象开始一个新的事务并且之后所有对数据对象开始一个新的事务并且之后所有对数据库的操作都通过该库的操作都通过该Session对象来进行对象来进行最
5、后,完成将响应页面发送到客户端的工作后再提交事务并且关最后,完成将响应页面发送到客户端的工作后再提交事务并且关闭闭Session Hibernate一级缓存nHibernate一级缓存的生命周期一级缓存的生命周期vHibernate的一级缓存是由的一级缓存是由Session提供的,因此它只存提供的,因此它只存在于在于Session的生命周期中,也就是当的生命周期中,也就是当Session关闭的时关闭的时候该候该Session所管理的一级缓存也会立即被清除。所管理的一级缓存也会立即被清除。Hibernate的一级缓存是的一级缓存是Session所内置的,不能被卸载所内置的,不能被卸载,也不能进行
6、任何配置。,也不能进行任何配置。 Hibernate一级缓存nHibernate一级缓存的实现一级缓存的实现v一级缓存采用的是一级缓存采用的是key-value的的Map方式来实现的,在缓方式来实现的,在缓存实体对象时,对象的主关键字存实体对象时,对象的主关键字ID是是Map的的key,实体对,实体对象就是对应的值。所以说,一级缓存是以实体对象为单象就是对应的值。所以说,一级缓存是以实体对象为单位进行存储的,在访问的时候使用的是主关键字位进行存储的,在访问的时候使用的是主关键字ID。二级缓存二级缓存 nSessionFactory的内置缓存和外置缓存的内置缓存和外置缓存 SessionFact
7、ory的内置缓存中存放了映射元数据和预定义的内置缓存中存放了映射元数据和预定义SQL语句,语句,映射元数据是映射文件中数据的副本,而预定义映射元数据是映射文件中数据的副本,而预定义SQL语句是在语句是在Hibernate初始化阶段根据映射元数据推导出来的。初始化阶段根据映射元数据推导出来的。SessionFactory的的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此语句,因此SessionFactory不需要进行内置缓存与映射文件的同不需要进行内置缓存与映射文件的同步;步; SessionFactory
8、的外置缓存是一个可配置的插件。在默认情况下,的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的不会启用这个插件。外置缓存的数据是数据库数据的副本,外置缓存的介质可以是内存或者硬盘副本,外置缓存的介质可以是内存或者硬盘SessionFactory的外置缓的外置缓存也被称为存也被称为Hibernate的二级缓存。的二级缓存。性能优化性能优化 n在进行在进行Hibernate性能优化时,需要从以下几个方面进行考虑。性能优化时,需要从以下几个方面进行考虑。 数据库设计调整。数据库设计调整。 HQL优化。优化。 API的正确使用(如根据
9、不同的业务类型选用不同的集合及查询的正确使用(如根据不同的业务类型选用不同的集合及查询API)。)。 主配置参数(日志、查询缓存、主配置参数(日志、查询缓存、fetch size, batch size等)。等)。 映射文件优化(映射文件优化(ID生成策略、二级缓存、延迟加载、关联优化)。生成策略、二级缓存、延迟加载、关联优化)。 一级缓存的管理。一级缓存的管理。 针对二级缓存,还有许多特有的策略。针对二级缓存,还有许多特有的策略。 事务控制策略。事务控制策略。性能优化性能优化 n数据查询性能对应用系统性能的影响数据查询性能对应用系统性能的影响v数据的查询性能往往是影响一个应用系统性能的主要因
10、素。对查询性能的数据的查询性能往往是影响一个应用系统性能的主要因素。对查询性能的影响会涉及到系统软件开发的各个阶段,例如,良好的设计、正确的查询方影响会涉及到系统软件开发的各个阶段,例如,良好的设计、正确的查询方法、适当的缓存都有利于系统性能的提升。法、适当的缓存都有利于系统性能的提升。v系统性能的提升设计到系统中的各个方面,是一个相互平衡的过程,需要系统性能的提升设计到系统中的各个方面,是一个相互平衡的过程,需要在应用的各个阶段都要考虑。并且在开发、运行的过程中要不断地调整和优在应用的各个阶段都要考虑。并且在开发、运行的过程中要不断地调整和优化才能逐步提升系统的性能。化才能逐步提升系统的性能
11、。设计阶段的考虑问题设计阶段的考虑问题 n在数据库设计阶段要综合考虑以下三个方面的因素在数据库设计阶段要综合考虑以下三个方面的因素v 1、业务需求、业务需求 在设计的过程中,一个很重要的因素是要紧扣业务需求。这是因为在设计的过程中,一个很重要的因素是要紧扣业务需求。这是因为任何的软件系统都是以业务为中心的,那么对于系统的设计也不例任何的软件系统都是以业务为中心的,那么对于系统的设计也不例外,在设计的阶段就应该考虑业务实现的方便性以及执行的效率。外,在设计的阶段就应该考虑业务实现的方便性以及执行的效率。一个良好的结构设计不但使业务功能的实现变得非常容易,并且可一个良好的结构设计不但使业务功能的实
12、现变得非常容易,并且可以避免很多复杂的操作,还可以达到提升系统性能的目的。以避免很多复杂的操作,还可以达到提升系统性能的目的。设计阶段的考虑问题设计阶段的考虑问题 n在数据库设计阶段要综合考虑以下三个方面的因素。在数据库设计阶段要综合考虑以下三个方面的因素。v2、Java建模建模在建立在建立Java对象模型的时候,要考虑数据库持久化的方便性,所建立的对象模型的时候,要考虑数据库持久化的方便性,所建立的Java对象模型应该可以很容易地被数据所存储,并且数据库中表的结构对象模型应该可以很容易地被数据所存储,并且数据库中表的结构也是越简单越好。也是越简单越好。设计阶段的考虑问题设计阶段的考虑问题 n
13、在数据库设计阶段要综合考虑以下三个方面的因素在数据库设计阶段要综合考虑以下三个方面的因素v 3、数据库结构、数据库结构在设计数据库结构的时候也要考虑到是否可以很容易地用在设计数据库结构的时候也要考虑到是否可以很容易地用Java对象对象去表示。这里并不是简单的一个表对应一个对象的直接转换,更重去表示。这里并不是简单的一个表对应一个对象的直接转换,更重要的是转换后的要的是转换后的Java对象应该能够描述出数据间的关系。对象应该能够描述出数据间的关系。批量插入、更新和删除批量插入、更新和删除 n大量数据处理产生的问题大量数据处理产生的问题v 在项目开发中,经常会遇到需要向数据库中一次插入大量数据的时
14、在项目开发中,经常会遇到需要向数据库中一次插入大量数据的时候,如果在开发中一味地调用候,如果在开发中一味地调用Session对象的对象的save()方法向数据库中方法向数据库中保存对象,那么就很可能会出现保存对象,那么就很可能会出现OutOfMemoryError(内存溢出)(内存溢出)异常。异常。v之所以出现这种情况是由于之所以出现这种情况是由于Hibernate缓存的影响。由于缓存的影响。由于Hibernate的一级缓存是由的一级缓存是由Hibernate自己进行管理的,并且只会存自己进行管理的,并且只会存在于内存中,所以,在调用在于内存中,所以,在调用save()方法的时候会将所保存的对
15、象都方法的时候会将所保存的对象都缓存起来,这样当数量巨大的时候就会出现内存溢出的情况了。缓存起来,这样当数量巨大的时候就会出现内存溢出的情况了。批量插入、更新和删除批量插入、更新和删除 n设置二级缓存设置二级缓存v为了避免内存溢出情况的发生,需要在调用为了避免内存溢出情况的发生,需要在调用save()方法的同时,阶段性地方法的同时,阶段性地刷新和清空一级缓存。刷新和清空一级缓存。v虽然通过设置可以使二级缓存不会发生溢出,但在进行大批量的插入操作虽然通过设置可以使二级缓存不会发生溢出,但在进行大批量的插入操作时,最好还是要禁用二级缓存,毕竟将对象保存到二级缓存是要耗费一定时时,最好还是要禁用二级缓存,毕竟将对象保存到二级缓存是要耗费一定时间的,在禁用二级缓存后可以避免录入大量数据所带来的性能问题间的,在禁用二级缓存后可以避免录入大量数据所带来的性能问题 /将本批插入的对象立即写入数据库并释放内存将本批插入的对象立即写入数据库并释放内存 session.flush(); session.clear();