`
mixer_a
  • 浏览: 356885 次
社区版块
存档分类
最新评论

Hibernate事务处理机制----2

阅读更多
二、JTATransaction

如果你在EJB中使用Hibernate,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction,先看一个例子:
javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

Session s1 = sf.openSession();
...
s1.flush();
s1.close();

...

Session s2 = sf.openSession();
...
s2.flush();
s2.close();

tx.commit();


这 是标准的使用JTA的代码片断,Transaction是跨Session的,它的生命周期比Session要长。如果你在EJB中使用 Hibernate,那么是最简单不过的了,你什么Transaction代码统统都不要写了,直接在EJB的部署描述符上配置某某方法是否使用事务就可 以了。

现在我们来分析一下JTATransaction的源代码,
net.sf.hibernate.transaction.JTATransaction:

public void begin(InitialContext context, ...
...
ut = (UserTransaction) context.lookup(utName);
...


看清楚了吗? 和我上面写的代码 tx = new Initial Context?().lookup("javax.transaction.UserTransaction"); 是不是完全一样?

public void commit() ...
...
if (newTransaction) ut.commit();
...

JTATransaction的控制稍微复杂,不过仍然可以很清楚的看出来Hibernate是如何封装JTA的Transaction代码的。

但 是你现在是否看到了什么问题? 仔细想一下,Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的 Transaction的操作顺序,但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的!!! JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction,因此当你使用JTA的 Transaction的时候,那么就千万不要使用Hibernate的Transaction,而是应该像我上面的JTA的代码片断那样使用才行。

总结:
1、在JDBC上使用Hibernate

必须写上Hibernate Transaction代码,否则数据库没有反应。此时Hibernate的Transaction就是Connection.commit而已

2、在JTA上使用Hibernate

写JTA的Transaction代码,不要写Hibernate的Transaction代码,否则程序会报错

3、在EJB上使用Hibernate

什么Transactioin代码都不要写,在EJB的部署描述符里面配置

|---CMT(Container Managed Transaction)
|
|---BMT(Bean Managed Transaction)
|
|----JDBC Transaction
|
|----JTA Transaction


--------------------------------------------------------------------------------

提问:

javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction"); 

Session s1 = sf.openSession(); 
... 
s1.flush(); 
s1.close(); 

... 

Session s2 = sf.openSession(); 
... 
s2.flush(); 
s2.close(); 


tx.commit();

s1不关闭,使用s2进行操作的代码中使用s1可不可以(我觉得这样更加节约资源,不需要反复的连接、关闭)

但sf.opengSession()时,并没有setAutoCommit(false),我想问的是,如果不编写任何事务代码,如:
Session s = sf.openSession(); 
...... 
s.close(); 

数据库会不会有反应(此时应该是默认AutoCommit为true)。

不会有反应。在sf.openSession() 创建Session实例的时候,就已经调用了conn.setAutoCommit(false)了。

另外,我想问一下:


1. s.flush()是不是必须的

2. s.close()是不是一定要关闭


--------------------------------------------------------------------------------

回答:

s.flush不是必须的,s.close()会调用一次s.flush()

s.close()正常情况下应该关闭,除非你是用ThreadLocal管理Session。

s1不关闭,使用s2进行操作的代码中使用s1可不可以(我觉得这样更加节约资源,不需要反复的连接、关闭)

在这个例子中看不出来JTA的作用。
假设
Class A {
find() {
Session s1 = sf.openSession(); 
... 
s1.flush(); 
s1.close(); 
}
}

Class B {
find() {
Session s2 = sf.openSession(); 
... 
s2.flush(); 
s2.close(); 
}
}

Main {

tx = ...;
A.find();
B.find();
tx.commit();
}
分享到:
评论

相关推荐

    详解Hibernate事务处理机制

    ### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...

    hibernate-release-5.2.10

    5. **事务管理**:Hibernate支持编程式和声明式事务管理,确保数据的一致性。 6. **缓存**:Hibernate内置了二级缓存机制,可以通过配置使用如Ehcache这样的缓存提供者,提高性能。 7. **关联映射**:包括一对一(@...

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    其中,Hibernate作为一款功能强大的ORM框架,极大地简化了Java对象与数据库表之间的映射关系处理。而JPA(Java Persistence API)是Java EE规范的一部分,为ORM提供了标准的接口。`hibernate-jpa-2.1-api-1.0.0....

    hibernate3+ proxool-0.9.1配置 和proxool-0.9.1.jar

    它支持多种数据库,包括MySQL、Oracle、SQL Server等,并且具备事务管理、缓存机制和查询语言HQL(Hibernate Query Language)等特性。 Proxool,全称为Proxy Connection Pool,是一个灵活、轻量级的数据库连接池。...

    hibernate-cglib-repack-2.1_3.jar

    但在Hibernate中,CGLIB主要用于动态代理,生成实体类的子类,从而实现在不修改原有代码的情况下,添加额外的行为,如懒加载、事务管理等。 在Hibernate中,实体类通常会被CGLIB动态代理,生成一个代理对象。当调用...

    Hibernate hibernate-core-1a8aca9.ta

    3. Transaction:事务管理是数据库操作的基础,Hibernate提供了Transaction接口来封装数据库的事务操作,确保数据的一致性和完整性。 4. Query和Criteria:用于执行SQL查询的API,Query基于HQL(Hibernate查询语言...

    JavaWeb-Hibernate-Struts2-Spring2

    - **Hibernate中文教程.chm**:这个教程可能涵盖了Hibernate的基础到高级用法,如实体类映射、会话管理、事务处理和查询优化。 - **css盒子模型.jpg**:CSS盒子模型是布局的关键,该图片可能展示了盒子模型的工作...

    hibernate-extensions-2.1.3.zip ,middlegen for hibernate

    - Event监听器:允许在特定的持久化操作前后执行自定义逻辑,如事务处理、日志记录等。 - 邮件服务:集成邮件发送功能,实现业务流程中的通知机制。 2. Middlegen: Middlegen是针对Hibernate的一个元数据生成...

    Hibernate的事务处理机制和flush方法的用法.docx

    在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...

    hibernate-release-5.2.16.Final.zip

    1. **对象关系映射(ORM)**:Hibernate的核心功能就是通过ORM机制将Java对象与数据库表进行映射,实现了程序代码与数据库结构的解耦,提高了开发效率。 2. **配置文件**:Hibernate的配置文件(hibernate.cfg.xml...

    hibernate-release-5.0.0.Final(1).zip

    Hibernate是Java领域中广泛使用的ORM工具,它允许开发者用面向对象的方式处理数据库操作,降低了数据库访问的复杂性。通过提供一种对象-关系映射机制,Hibernate可以将数据库表映射为Java类,使得数据库操作如同操作...

    hibernate-release-5.0.7.Final.zip

    Hibernate,作为Java领域中的一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以使用面向对象的方式处理数据库事务。在2016年,传智播客黑马程序员发布的Hibernate教程中,特别选用了...

    hibernate-release-4.2.4.Final.zip

    9. **事务管理**:Hibernate支持自动和手动的事务管理,可以很好地处理并发和数据一致性问题。开发者可以通过Session的beginTransaction、commit和rollback方法来控制事务的边界。 10. **缓存机制**:Hibernate提供...

    hibernate-release-4.2.4核心jar包

    这个jar包是使用Hibernate进行开发时必不可少的部分,它定义了Hibernate API,提供了Entity Manager和Session接口,以及对事务处理的支持。 其次,`javassist-3.15.0-GA.jar`是Java编程辅助工具包,它允许在运行时...

    hibernate-jpa-2.0-api-1.0.1.Final-sources

    2. **Hibernate JPA的扩展性**:Hibernate是JPA的一个实现,以其强大的功能和灵活性赢得了广泛认可。Hibernate JPA 2.0 API在JPA的基础上进一步提供了丰富的功能,包括事务管理、查询语言HQL和 Criteria API等。 3....

    最新 hibernate-release-4.2.13.Final.tgz

    在“hibernate-release-4.2.13.Final”目录下,你会发现一系列的核心jar包,如hibernate-core.jar,它包含了Hibernate的主要功能,包括实体管理、查询API、事务处理等。此外,还有hibernate-entitymanager.jar,专注...

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip

    本篇文章将重点围绕“hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip”这一压缩包,深入解析Hibernate对JPA 2.1 API的实现,以期帮助读者深入理解其内部机制。 JPA(Java Persistence API)是Java平台上的一个...

    hibernate源码release-4.1.4.Final版

    Hibernate提供了save()、update()、merge()和delete()方法来处理对象的持久化状态。其中,save()适合新对象的插入,update()用于已存在对象的更新,merge()则是合并当前对象状态到持久化对象,delete()则删除对象。 ...

    hibernate-orm-master.zip

    六、事务处理 在Hibernate中,事务管理是通过Session的beginTransaction()、commit()和rollback()方法实现的。事务的隔离级别和回滚规则可以根据具体需求进行配置。 七、关联映射 Hibernate支持多种关联映射,包括...

    hibernate-distribution-3.5.6-Final.rar

    4. 性能优化:此版本对缓存机制进行了优化,提高了查询效率,同时改进了事务处理,降低了数据不一致的风险。 5. Query Language(HQL):Hibernate特有的面向对象的查询语言,允许开发者用类和属性而不是表和列进行...

Global site tag (gtag.js) - Google Analytics