`
ahcen001
  • 浏览: 4791 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate-jdon框架事务边界及session的一些讨论

阅读更多
转自jdon论坛 oojdon提问:

//数据库请求到来,从当前ThreadLocal取session并开始事务 
public Session getSession() throws HibernateException {  
 Session sess = (Session)SessionFactoryHolder.getSession();          
                if (sess == null) { 
                sess = getFactory().openSession();    
 
 Transaction tr = sess.beginTransaction();   
 
 SessionFactoryHolder.setSession(sess);   
 
 SessionFactoryHolder.setTransaction(tr);          
 } 
                  return sess; 
} 


//CloseSessionInView,提交事务 
public void closeSession() throws HibernateException { 
 
 Transaction tr = (Transaction) SessionFactoryHolder.getTransactio(); 
 
 try { 
   if (tr != null; !tr.wasCommitted(); !tr.wasRolledBack()) { 
   tr.commit(); 
   } 
 } catch (Exception e) { 
 }finally{ 
  SessionFactoryHolder.setTransaction(null); 
 
  SessionFactoryHolder.getSession().close(); 
 
  SessionFactoryHolder.setSession(null); 
 } 
}
 

1,没有使用Hibernate的JiveJdon,持久层使用JdbcTemp,没有事务,默认自动提交
 
public void createTopicMessage(EventModel em) throws Exception { 

 ForumMessage forumMessage = (ForumMessage)em.getModelIF();  
       
 Forum forum = forumBuilder.getForum(forumMessage.getForu().getForumId()); 
        
 forumMessage.setForum(forum); 
        
 ForumThread forumThread = super.createThread(forumMessage);  
      
 forumMessage.setForumThread(forumThread);        
 
 messageDaoFacade.getMessageDao().createMessage(forumMessage);
 
} 


2,没有使用Hibernate的JiveJdon,持久层使用JdbcTemp,使用JTA事务接口 

public void createTopicMessage(EventModel em) throws Exception { 
 ForumMessage forumMessage = (ForumMessage)em.getModelIF();  
       
 Forum forum = forumBuilder.getForum(forumMessage.getForum().getForumId());         

 forumMessage.setForum(forum);         

 TransactionManager tx = jtaTransactionUtil.getTransactionManager();                 
 try {           
   tx.begin();  
           
   ForumThread forumThread = super.createThread(forumMessage); 
            
   forumMessage.setForumThread(forumThread);  
           
   messageDaoFacade.getMessageDao().createMessage(forumMessage);      
       
   tx.commit();         
 }catch (Exception e) {             
   logger.error(e);             
   jtaTransactionUtil.rollback(tx);             
   throw new Exception(e);         
 }     
} 


3,使用了Hibernate的JiveJdon,使用jdon框架整合Hibernate的事务处理----事务边界是数据库请求—>页面渲染结束 

public void createTopicMessage(EventModel em) throws Exception { 

 ForumMessage forumMessage = (ForumMessage)em.getModelIF();     
    
 Forum forum = forumBuilder.getForum(forumMessage.getForum().getForumId());         

 forumMessage.setForum(forum);     
    
 ForumThread forumThread = super.createThread(forumMessage);  
       
 forumMessage.setForumThread(forumThread);         

 messageDaoFacade.getMessageDao().createMessage(forumMessage); 
} 


4, 使用了Hibernate的JiveJdon,但手工使用JTA接口 

public void createTopicMessage(EventModel em) throws Exception { 
 ForumMessage forumMessage = (ForumMessage)em.getModelIF(); 
        
 Forum forum = forumBuilder.getForum(forumMessage.getForum().getForumId());  
       
 forumMessage.setForum(forum);         

 TransactionManager tx = jtaTransactionUtil.getTransactionManager();                 
 try {           
   tx.begin();             
   ForumThread forumThread = super.createThread(forumMessage);   
          
   forumMessage.setForumThread(forumThread);  
           
   messageDaoFacade.getMessageDao().createMessage  (forumMessage);             

   tx.commit();   
      
 } catch (Exception e) {             
   logger.error(e);             
   jtaTransactionUtil.rollback(tx);             
   throw new Exception(e);         
 }     
} 


5,jivejdon已经向EJB平滑升级,所以方法是这样的 

@TransactionAttribute(REQUIRES_NEW) 

public void createTopicMessage(EventModel em) throws Exception { 

 ForumMessage forumMessage = (ForumMessage)em.getModelIF();    
     
 Forum forum = forumBuilder.getForum(forumMessage.getForum().getForumId());         

 forumMessage.setForum(forum);             

 ForumThread forumThread = super.createThread(forumMessage);             

 forumMessage.setForumThread(forumThread);  
           
 messageDaoFacade.getMessageDao().createMessage(forumMessage); 
} 


我比较郁闷的就是这四,五两种写法,事务在方法返回后结束,但是Hibernate的sessin呢?是还打开,还是已经被关闭,如果关闭我的懒加载怎么办?

banq等回复:
我也赞成使用第四 五种方式,在这两个方式下,我前面帖子写了,不必关闭session的两种方式处理事务和Session的关系:
1. 手工在事务结束前session.flush()
2. 配置Hibernate的transaction.mamager为JTA,让Hibernete能够自动进行flush,它会侦测当前是否在一个事务,如果事务结束,它就进行flush,将内存中状态和数据库数据进行同步。

事务和Session本来特别关系,事务主要是保证数据库资源操作的一致性,所以,需要flush来特别操作。

不要将事务搞神秘,事务基本只有两个JTA长事务(包括跨段2PC事务)和JDBC短事务,Hibernate本质就是JDBC+缓存。事务是JavaEE基础功能,可以下载JavaEE标准看看,和任何框架都不搭架(除非专门提供事务的框架)。

Spring和EJB一样,只是提供事务的AOP切入方式,也就是说,无需自己手工写transaction.begin,因为AOP拦截器做了。Spring本身没有提供除JTA/JDBC事务以外任何神秘新的功能。

如果了解AOP,就知道:transaction.begin不在当前程序写,只是移到拦截器中写,写的地方不一样了。这就是区别,因为不需要你在程序自己写transaction.begin(这叫显式调用),也就是隐式调用JTA了,从你眼前隐去了。这个区别就是对JTA事务调用方式的不同,而不是JTA事务本身的不同,不要将这两者混同在一起。

不要把"JPA、Hibernate、JDO和JTA"混同在一起,JTA是JavaEE基础功能,而JPA、Hibernate、JDO只是持久化框架,和JTA无关。也就是说,JPA、Hibernate、JDO没有JTA也可以用,JTA没有JPA、Hibernate、JDO也可以用。

所以,如果你搞不定JTA,就不急于使用它。JTA通常在Service或业务层来使用(transaction.beigin显式调用或AOP/EJB的隐式调用),可以跨多个JDBC或其他资源,这个可以参考本站事务标签了解一下。

因为JTA在业务层使用,才可能和Spring/EJB这样框架有点关系,这个关系也就是显式调用或隐式调用的关系,就像两个男女,本是独立的,发生关系了,要么是显式声明的,登记结婚大张旗鼓(表现为需要写代码),要么就是偷情隐式的,悄悄的(表现为不需要写代码了)。

事务是JavaEE中最复杂的知识,它和原子性 多线程 锁等有关(所以才有取款机吐钱,记录数据没变化等不一致性,这些都充分说明国人对事务安全非常薄弱),说大了也和并行计算有关(在多个CPU同时执行你的程序情况下,如何保证你业务真正原子性和唯一性,又不能丧失多线程多核的优势。)。这个世界上最缺的就是编写并发计算的人,这是有道理的。

另外,要注意:框架和JavaEE组件要有区分。框架实际就是把这些组件扒拉扒拉在一起,方便或约束你使用,从设计上让你的程序更所谓优雅,当然也有弄巧成拙,搞复杂了,Spring至少是这样,一些人以为复杂就是优雅实际被误导(最可悲就是不自知),所以Spring没热多长时间,Ruby on Rails以其简洁性成为热点,这是有原因的,现在Scala又开始热起来,因为大家发现RoR慢啊,如果能够使用多核的DSL多好啊,设计又优雅性能又优雅,双优雅,这才是真优雅。

分享到:
评论

相关推荐

    Java 中的设计模式 - jdon

    4. 面向切面的编程(AOP)模式:虽然Java语言本身没有内置AOP支持,但通过第三方库如Spring框架,我们可以实现切面编程,它提供了一种模块化交叉关注点的方式,比如日志、事务管理等。 5. 模板设计模式:这是一种...

    jive-jdon-2.5 论坛源码及研究

    本Jive(Jdon版)可在Jbuilder 7直接打开。 建议你用Jbuilder7打开后,编辑相应设置(JDK1.4) 本软件在linux+jdk1.4+tomcat 4以上环境运行正常,中文显示正常。 Jive是学习java设计模式的最好教材 Jive论坛的优点 ...

    jive-jdon-2.5

    Jive是一个开放源码的Java论坛软件,它允许在网站上进行线程化的讨论。它提供了性能优秀的用户定义的JSP文件(用Jive的外壳)来完全改变论坛的外观、形象和功能。并提供了一个可植入的API,这些API提供诸如及时翻译、...

    jdon框架的使用-中文pdf清晰版

    ### Jdon框架使用详解 #### 一、Jdon框架概述 **Jdon框架**是一款针对J2EE(Java 2 Platform, Enterprise Edition)环境下的快速开发框架,旨在提高开发效率和降低开发难度。该框架由板桥里人(banq)创建并维护,自...

    jdon_struts_hibernate_samples,jdon例子

    【标题】"jdon_struts_hibernate_samples" 是一个整合了Jdon、Struts和Hibernate技术的示例项目。这个项目展示了如何在Java Web开发中有效地利用这三个框架进行业务逻辑处理、用户界面展示以及持久层操作。 【描述...

    框架 源代码 struts+ jdon+ hibernate

    框架 源代码 struts jdon hibernate

    struts+jdon+hibernate.rar_j2me_struts hibernate

    Struts、JDon和Hibernate是三个在Java EE(以前称为J2EE)开发中非常重要的框架,它们分别专注于Web层、领域驱动设计和持久化管理。让我们深入了解一下这三个框架及其结合使用的方式。 **Struts** Struts是一个开源...

    JDON框架源码

    Jdon Framework(简称JF)是一套适合开发中小型J2EE/JavaEE应用系统的轻量Web框架(Lightweight Java Web Framework)。是国人独立开发的中国人自己的框架产品,2005年入选全球SUN公司网站java.net正式企业应用目录。...

    JdonFramework-MVC框架

    JdonFramework是一款由中国著名软件开发者陈军(Jdon)设计和开发的轻量级MVC(Model-View-Controller)框架,它旨在为Java应用提供快速、高效的开发环境。MVC模式是软件工程中的一种经典设计模式,通过将业务逻辑、...

    jdon+structs+hibnate示例

    在这个示例中,jdon框架与Struts和Hibernate进行了集成,构建了一个强大的应用开发基础。 【描述】提到,jdon框架在设计时考虑了自动化和效率,封装了大量的增删改查(CRUD)操作,这使得开发者可以更专注于业务...

    DDD jDon源码

    通过观察源码,可以学习如何有效地利用ORM框架(如Hibernate)进行数据持久化,以及如何设计松耦合的接口,以适应不同的技术栈。 6. **事件驱动架构**:jDon可能采用了事件驱动的设计模式,通过发布和订阅事件来...

    JdonFramework开源框架 v6.6.zip

    Jdon Framework(简称JF)是一套适合开发中小型J2EE/JavaEE应用系统的轻量Web框架(Lightweight Java Web Framework)。是国人独立开发的中国人自己的框架产品,2005年入选全球SUN公司网站java.net正式企业应用目录。...

    Java框架研发思考.docx

    然而,作者并不满足于仅仅集成现有框架,他希望实现业务层和持久层的紧密集成,避免ORM框架如Hibernate可能带来的业务实体对象绑架问题。因此,Jdon框架选择了不同的设计路径,即业务实体对象常驻内存,以提高性能,...

    JdonFramework-5.0_04.zip

    Jdon Framework(简称JF)是一套适合开发中小型J2EE应用系统的快速开发框架、也是一套Ioc/Aop框架、更是一套符合当前国际水平的、面向组件开发的、国人拥有自主产权的中间件产品。中国第一个开源框架,国内先进的...

    jdon-mvn-repo:jdon-mvn-repo

    【jdon-mvn-repo:jdon-mvn-repo】是一个与Java开发相关的资源库,主要服务于Maven构建系统。Maven是一个强大的项目管理和依赖管理工具,它通过使用XML格式的配置文件来管理项目的构建、报告和文档。在这个资源库中...

    Java框架研发思考

    1. **框架的集成整合**:选择当时流行的Struts作为表现层框架,Spring作为业务层框架,以及Hibernate等作为持久层框架。这种集成方式可以充分利用各个框架的优点,同时减少开发者的学习成本。 2. **业务实体对象的...

    JdonFramework使用开发指南.rar

    搞过数据库系统的人都知道,数据库系统中大量的基本功能无非是数据表的CRUD增删改查和批量分页查询,Jdon框架结合对象设计和J2EE/JEE 设计理念将这个看似简单功能开发过程抽象出来,放在框架中,并且随着应用程序...

    JdonFramework开源框架 v5.1 Build20071025_jdonframework(毕设 + 课设).zip

    4. **持久层支持**:虽然提供的信息中没有明确指出Jdon对持久层的具体支持,但根据文件名如HibernateTemplate.class,可以推测Jdon可能集成了Hibernate作为ORM工具,为开发者提供了方便的数据访问接口,简化了数据库...

    Jdon论坛

    本Jive(Jdon版)可在Jbuilder 7/8直接打开,请失效Jbuilder的Jsp编译功能。 建议你用Jbuilder7打开后,编辑相应设置(注意,必须是JDK1.4以上版本) 本软件在linux+jdk1.4+tomcat 4以上环境运行正常,由于采取ISO...

    Jive Jdon Jbuilder7

    同时,Jbuilder7还可能包含了一些针对Jive Jdon框架的定制优化,使得开发基于该框架的项目更加得心应手。 在压缩包中的"read.txt"文件,很可能是项目的阅读指南或使用说明,包含Jive Jdon Jbuilder7的详细教程和...

Global site tag (gtag.js) - Google Analytics