楼上,怎么做成一个事务呀(ejb我不熟),在程序中实际上我是在这个session bean中的一个方法里要调用不同的DAO实现来操作数据库,如何做成一个事务请细说呀?!

解决方案 »

  1.   

    还有就是这些不同的DAO操作不能和在一个DAO方法里面,都是分别调用完成,只是是在一个session bean方法中调用的,所以这些DAO的操作如何能实现同一个事务了?!
      

  2.   

    其实我也没有遇到你的问题,但我可以给你个解决问题的方向,不知道是否可以帮到你的忙.
    EJB组件配置文件中有一个事务属性,你仔细看看他们的说明,看看对你有没有帮助,如下:
    1、Required:当客户端运行一个事务处理并调用EJB的一个方法,这个方法执行客户端的事务处理;当客户端没有启动一个事务处理,则EJB容器在执行这个方法之前启动一个新的事务处理. 2、RequiresNew:当客户端运行一个事务处理并调用EJB的一个方法时,容器管理器做如下操作: 
    (1) 悬挂客户端的事务处理; 
    (2) 开始一个新的事务处理; 
    (3) 调用方法; 
    (4) 当方法结束,恢复客户端的事物处理. 
    当客户端没有启动一个事务处理,容器管理器在执行这个方法之前启动一个新的事务处理. 
    3、Mandatory: 当客户端运行一个事务处理并调用EJB的一个方法,这个方法在客户端的事务处理范围内被执行; 当客户端没有启动一个事务处理,容器管理器将会抛错(TransactionRequiredException); 
    4、NotSupported: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器在调用方法之前终止客户端的事务处理,当方法执行完,再恢复客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理. 
    5、Supports: 当客户端运行一个事务处理并调用EJB的一个方法,在运行方法时执行客户端的事务处理; 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理. 
    6、Never: 当客户端运行一个事务处理并调用EJB的一个方法,容器管理器将抛出一个错误(RemoteException); 当客户端没有启动一个事务处理,容器管理器在调用方法时不启动事务处理.希望可以帮到你
      

  3.   

    EJB的事务机制好好熟悉一下,也许你的问题自己就可以解决拉.
      

  4.   

    多谢chuan122345,ejb的事务应该好好学学,以前都没用过ejb,工作需要呀!
      

  5.   

    实际上我感觉我的问题就是如何在session bean中的一个方法内实现跨数据库的事务的维护,不知ejb容器能不能做到?
      

  6.   

    在DAO基类里面写一个方法可以处理批量查询,然后在里面设定事务管理即可
      

  7.   

    EJB强大的一个功能就是声明式事务处理,看一下你的application server关于这部分的内容吧,肯定可以实现的.
      

  8.   

    我感觉上也应该能够利用ejb容器来实现事务的管理,我用的是jboss4,不过跨数据库的事务维护能不能简单的通过设定声明来让容器来实现了,(我可不想用什么jta等等,太复杂了),还有就是在session bean 中一个方法里调用的dao有多个基类,对应不同的数据库以及业务逻辑,所以没办法像wangx1949所说用一个dao方法来做。
      

  9.   

    问题已解决,其实也是很简单的,但这里有个前提,就是你的数据库操作中的数据库连接不能用simple的jdbc连接(这就是为什么我开始的demo总是不成功),必须要用连接池来获得connection,原因我后面再说,当我们进行跨数据库的操作时,每一个dao的操作我们必须要抛出异常,即在dao中我们的操作方法遇到异常时,在catch部分处理掉了异常后,要再抛出一个异常(任意的都可以,其实也可以在dao中不捕获异常,直接让异常到上一层),这样异常就会传到session bean的方法中,然后session bean再捕获它,在session bean 的方法的catch部分加上sessionContext.setRollbackOnly()这样就能做到整体操作的事务一致性的维护了。
          我感觉这里面的实际情况还是用到了ejb容器提供的强大的事务性机制,只是我们要让异常得以通知到ejb容器,然后在catch部分实现回滚。至于为什么非要用数据源了,我感觉是因为在数据源中当我将connection.close()是有可能并没有真正的close()(数据源是有优化的,所以它还可能保留了连接的信息),而simple的jdbc可能要是close()就真正的close了,但这只是我的想法!
      

  10.   

    楼主说的很好,其实我昨天看书的时候,看到分布式平面事务那不分就提到有支持,在同一个事务中操作不同的数据库,所以至少可以肯定EJB是可以满足你的这个需求,现在你的问题已经解决了,我想你对它的认识也慢慢加深了,我们也从中学到了经验,恭喜楼主。