论坛首页 Java企业应用论坛

DAO设计模式和事物处理

浏览 27812 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-02-20  
DAO
我看了网上关于DAO Pattern 应用的一些实例和资料:

DAO 设计模式讲解, 涉及到Transaction 产生和消亡边界,异常处理.

Sourceforge中的一个关于DAO Pattern 的实现
http://daoexamples.sourceforge.net

IBM 上的关于DAO Pattern 的资源
http://www-106.ibm.com/developerworks/library/j-dao/

但是我有这样的疑问:事物应该在哪儿管理:取得和关闭。如果放到DAO实现类中,要是一个操作涉及到多个DAO类怎么保证事物中进行这些操作呢?如果放到调用DAO的业务层操作类中, 然后表现层直接调用业务层的操作类,即DAO类完全透明,DAO类中操作的Connection(即hibernate 的 Session)通过参数形式传入,这样做是否可行呢?我看看上面的资料,他的观点是这些重代价的对象不要通过参数传,为什么呢?

谢谢
   发表时间:2004-02-20  
引用
Sourceforge中的一个关于DAO Pattern 的实现

这个说得比较详细了
0 请登录后投票
   发表时间:2004-02-20  
DAO的事务管理是大问题

如果在DAO内部管理,那很简单,但这样就是原子操作,遇到长事务就不行了,而且过多的短事务会影响性能。
但在DAO外管理,就比较麻烦。透明有一篇文章,使用Spring在DAO外部管理事务,你可以参考一下,他的网站上有的。
0 请登录后投票
   发表时间:2004-02-20  
无明 写道
DAO的事务管理是大问题

如果在DAO内部管理,那很简单,但这样就是原子操作,遇到长事务就不行了,而且过多的短事务会影响性能。
但在DAO外管理,就比较麻烦。透明有一篇文章,使用Spring在DAO外部管理事务,你可以参考一下,他的网站上有的。


有同感, 现在就是这样的情况,不晓得怎么处理。个人倾向于使用长事务的处理方法:即把事务管理放到DAO外面,但是这样处理很麻烦,感觉不晓得怎么下手。

在hibernate论坛上有个贴子也谈到了这个问题,就像无明所说,很多人都建议采用Spring来进行事务管理:


http://forum.hibernate.org/viewtopic.php?t=925108
0 请登录后投票
   发表时间:2004-02-20  
DAO里面实现的是原子操作,一个事务操作换句话说也可以看作是一次完整的业务操作(当然是对于业务系统来说的),所以事务应该放在业务处理层,也就是Facade层进行。简单地说就是放在SessionBean或者JavaBean当中进行。
   楼上刚才问怎么进行事务处理,如果是SessionBean,就不要说了,选择Required,会自动具有事务属性。如果是JavaBean,那么我们可以采用两种方式进行处理了。第一种,也就是资源共享,说白了,一般系统的事务就是访问数据库(如果包括IO或者其他就复杂了),那么要进行一个事务,就是要保证在javaBean中调用的DAO所采用的数据库链接是同一个,也就是达到链接的共享,这个方法,应该不要再明说了吧。第二种,比较复杂,也就是采用模拟EJB容器调用EJB的方式,delegate层调用的是一个facade接口,那么通过proxy模式,定向到到容器类,通过Template模式自动加载事务的前后缀(其实也就是开始事务、结束事务),同时通过Java的反射机制(或者通过proxy模式)具体JavaBean实现,这个时候,在调用DAO的时候就不需要考虑数据库链接了(但是要保证DAO的数据库链接来自于容器类)。
0 请登录后投票
   发表时间:2004-02-20  
凤舞凰扬 写道

   如果是JavaBean,那么我们可以采用两种方式进行处理了。第一种,也就是资源共享,说白了,一般系统的事务就是访问数据库(如果包括IO或者其他就复杂了),那么要进行一个事务,就是要保证在javaBean中调用的DAO所采用的数据库链接是同一个,也就是达到链接的共享,这个方法,应该不要再明说了吧。第二种,比较复杂,也就是采用模拟EJB容器调用EJB的方式,delegate层调用的是一个facade接口,那么通过proxy模式,定向到到容器类,通过Template模式自动加载事务的前后缀(其实也就是开始事务、结束事务),同时通过Java的反射机制(或者通过proxy模式)具体JavaBean实现,这个时候,在调用DAO的时候就不需要考虑数据库链接了(但是要保证DAO的数据库链接来自于容器类)。


凤舞凰扬,你能不能讲的仔细点,我对设计模式不是很了解,没有系统的看过设计模式的书籍和相关资料,所以你说的一些概念不能很好的理解,可不可以给出一个详细的例子。就是你说的第二种方式。

我现在的问题主要是:

    * 如何开启一个事务
    * 如何结束一个事务
    * 那个对象负责开启事务
    * 那个对象负责关闭事务
    * 是否需要由DAO类来负责管理事务
    * 如果一个业务操作涉及到多个DAO对象的操作,应用程序怎样操作
    * 事务跨越多个DAO类还是单个DAO类
    * DAO类之间是否需要相互调用,如果需要的话,怎么管理事务。
注:引用Sean C. Sullivan  在Advanced DAO programming文章观点,但是我不觉得他对这些问题的解决办法很好。


谢谢
0 请登录后投票
   发表时间:2004-02-21  
凤舞凰扬的意思就是自己写个session bean事务管理一样的东西吧
不管你操作多少个DAO,最后你应该有个体现业务逻辑的facade,
事务应该围绕在这个facede周围啊
事务对于DAO而言,应该是透明的

网上有那么多的AOP framework 不知道有没有用来做事务管理的
1 请登录后投票
   发表时间:2004-02-21  
参考一下这个吧:
http://xglw.51.net/5team/springframework/viewtopic.php?t=156&highlight=

透明的网站,里面有他提到的几篇文章及源码:
http://gigix.cool2u.net/
1 请登录后投票
   发表时间:2004-02-21  
谢谢无明提供一个不错的网站。

在hibernate网站上找到这篇文章, 浏览了一遍,感觉spring与hibernate集成很好(没有学习过spring)。
按照文档说的,这样事务操作交给了spring。

http://www.hibernate.org/110.html
0 请登录后投票
   发表时间:2004-02-21  
楼上xangd说得对,事务对于DAO来说应该是透明的,事务应该是在Facade层,包括事务的开始,提交,回滚都应该在Facade层处理,当然Facade层可以是简单的javaBean。
   比如你的DAO的构造的时候,它所需要的数据库链接是由Facade层传入的,那么多个DAO传入的都是一个链接,在Facade里控制链接的事务属性。当然,考虑到封装和移植,这种链接是采用接口的形式,不一定是数据库链接。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics