Hibernate事务控制_第1页
Hibernate事务控制_第2页
Hibernate事务控制_第3页
Hibernate事务控制_第4页
Hibernate事务控制_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4.7问题控制系统每个业务逻辑方法都由一系列可以修改多个数据记录的数据库访问组成,这一系列修改必须是整体性的,不能只修改其中的几个。也就是说,多个数据库原子访问必须绑定到一个完整的,这就是事务。交易是整个交易无法个别执行或同时或还原的最小逻辑执行单位。4.7.1服务概念事务处理是由一个步骤或几个基本操作组成的逻辑执行单元,这些基本操作不能全部执行、全部取消或部分执行。通常,每次用户请求时都对应于一种业务逻辑方法,一种业务逻辑方法经常需要具有逻辑原子性的事务。例如,更正两个帐户馀额的转移操作。两个帐户修改同时有效,或者的同时取消操作在转帐成功的同时取消是转帐失败的情况。但是,不能只修改这些帐户中的一个。这会破坏数据库的完整性。交易通常有四个特性:原子性、一致性、分离性、持续性。这四个特性也简称为ACID城堡。原子性:事物是应用的最小执行单位,就像原子是大自然中最小的粒子,具有不可分割的特征一样。事务是应用程序不能细分的最小逻辑执行程序。一致性:需要将数据库从一种一致性状态更改为另一种一致性状态的事务执行的结果。如果数据库仅包含成功提交事务处理的结果,则数据库处于一致状态。如果系统运行中断,事务未完成而强制中断,则在未完成的事务中对数据库所做的修改被写入数据库后,数据库将处于错误状态。例如,银行在两个账户之间转账,将1000韩元从a账户转入b账户。系统先减少a账户的1000元,然后增加1000元到b账户。如果所有执行都成功,则数据库处于一致状态。如果不增加b帐户的金额,只修改a帐户的金额,数据库将处于不一致状态。因此,一致性是通过原子性来保证的。隔离:每个事务的执行互不干涉,任何事务的内部操作都与其他并发事务隔离。也就是说,不能在同时运行的事务之间相互影响。持续性:持续性也称为持续性,交易提交后,对数据的所有更改都将写入永久性存储中,通常保存在物理数据库中。4.7.2 Hibernate服务Hibernate直接使用JDBC连接和JTA资源,而不添加其他锁定行为。Hibernate仅添加自动版本控制,不会锁定内存中的对象或更改数据库事务的隔离级别。默认情况下,使用Hibernate相当于直接使用JDBC(或JTA/CMT)访问数据库。创建Hibernate的SessionFactory对象(一个线程安全对象,旨在所有应用程序线程共享)需要很高的成本。通常,SessionFactory是在应用程序启动时创建的,创建SessionFactory并不容易关闭,仅在关闭应用程序时关闭。Session对象很轻,线程不安全。对于单个业务流程单个工作单元,Session仅使用一次。创建会话时,与数据库的连接不会立即打开。仅当需要数据库操作时,Session才会导入JDBC连接。因此,打开和关闭Session对性能没有太大影响。如果无法确定请求是否需要数据访问,则仍可以打开Session对象。因为如果没有数据库访问权限,则Session不会导入JDBC连接。相反,数据库事务应尽可能短。这减少了数据库锁定引起的资源争用。由于长数据库事务处理,应用程序可能无法承载高并发负载。如上所述,由于事务通过Session打开,因此Hiberante的Session和事务是密切相关的。那么工作的范围是多少?单个会话可以跨多个数据库事务处理吗?事务处理和会话的匹配情况如何?以下说明了Hibernate Session与事务的关系。4.7.3事务和会话数据库操作必须在Hibernate的Session管理下进行,但是不建议数据库事务因简单的数据库原子调用而打开和关闭Session一次。因为在一次原子操作中打开的事务没有意义,事务必须将多个操作步骤组合为一个逻辑整体。事务是按顺序传输并构成一个逻辑整体的原子操作单元。注:也就是说,发送单个SQL语句后,自动事务处理提交模式无效。此自动提交模式专为SQL控制台设计,在实际项目中没有太多实际价值。Hibernate不允许立即自动提交事务,也不允许应用程序服务器自动提交事务。一般建议每个请求一个会话。在此模式下,来自客户端的请求将发送到服务器端,这可能与业务逻辑方法相对应。在此业务逻辑方法中,打开新的Hibernate Session,然后启动事务,在事务中执行此工作单元的所有数据库操作。作业完成后,还准备了发送到客户端的响应。此时提交事务并关闭会话。在此模式下,会话和用户请求是一对一的关系,是理想的会话管理模式。要达到此效果,建议使用ThreadLocal变量将Session绑定到处理客户端请求的线程。这样,可以从在该线程上运行的所有程序代码中轻松访问Session。您也可以根据在ThreadLocal变量中选择的数据库事务分区机制,保留事务上下文环境。此实施模式称为ThreadLocal Session和Open Session in View。下面的示例将HibernateUtil类存储在一个ThreadLocal变量中,以便于访问来自同一线程的请求:Public class HibernateUtilpublic static final session factory;/静态初始化块。使用该类时,将使用此代码块Static(静态)Try/使用默认的hibernate.cfg.xml启动Configuration实例configuration configuration=new configuration()。configure();/在Configuration的实例中创建SessionFactory实例session factory=configuration . buildsessionfactory();Catch (Throwable ex)system . err . print ln(“session factory初始化失败”ex);throw new exceptioninitial izereror(ex);/ThreadLocal是隔离多个线程的数据共享,多个线程之间不共享资源,因此不再需要同步线程public static final thread local session=new thread local();/此方法用于获取当前线程的Session对象public static session currentsession()throws hibernate exceptionSession s=(Session)Session . get();/如果该线程尚不存在Session,请创建新SessionIf (s=null)s=session factory . open session();/将输入的Session变量存储在ThreadLocal变量的Session中session . set(s);return s;/此方法用于关闭当前线程中的Sessionpublic static void close session()throws hibernate exceptionSession s=(Session)Session . get();If (s)!=null)s . close();Session.set(空);在上面的代码中,Hibernate Session绑定到当前线程。如果调用CurrentSession方法时已创建当前线程的Session,则将返回此现有Session实例。对应于每个请求一个会话的模式需要合并一系列用户操作,这些操作不仅是业务实体设计,而且是许多业务处理进程中用户对数据库的交互访问。但是,对于企业应用程序,不允许用户之间进行交互的数据库事务处理。例如,在第一页上,用户可以打开对话框,打开特定会话加载的数据,随意修改对话框中的数据,修改完成后,用户可以将修改结果保存到数据库中。从使用者的角度来看,此作业单位称为应用程式长交易。在一个J2EE应用程序实施中,可以有多种方法实现这些应用程序长事务处理。一种更糟的方法是,在用户思考时,应用程序保持Session和数据库事务打开,保留数据库锁定以防止并发修改,从而确保数据库事务隔离级别和原子操作。由于这些数据库锁定,应用程序无法扩展并发用户数。因此,请不要使用每个应用程序一次Hibernate Session的相应模式,或每个Http Session一次Hibernate Session的相应模式。注意:大多数情况下,请不要使用对应于Hibernate Session的模式(每个应用程序一次)或对应于Hibernate Session的模式(每个Http Session一次)。在这种情况下,Hibernate主要以两种模式解决问题:如果用户在每个会话中请求一次,则隔离对象。这样,在您思考的过程中,以前加载的实例将始终与Session分离,并处于关闭状态。它们都处于与Session分离的状态。使用Hibernate,可以将脱离管道对象与Session重新关联,并继续进行修

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论