锁定老帖子 主题:DAO设计模式和事物处理
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-02-20
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)通过参数形式传入,这样做是否可行呢?我看看上面的资料,他的观点是这些重代价的对象不要通过参数传,为什么呢? 谢谢 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-02-20
引用 Sourceforge中的一个关于DAO Pattern 的实现
这个说得比较详细了 |
|
返回顶楼 | |
发表时间:2004-02-20
DAO的事务管理是大问题
如果在DAO内部管理,那很简单,但这样就是原子操作,遇到长事务就不行了,而且过多的短事务会影响性能。 但在DAO外管理,就比较麻烦。透明有一篇文章,使用Spring在DAO外部管理事务,你可以参考一下,他的网站上有的。 |
|
返回顶楼 | |
发表时间:2004-02-20
无明 写道 DAO的事务管理是大问题
如果在DAO内部管理,那很简单,但这样就是原子操作,遇到长事务就不行了,而且过多的短事务会影响性能。 但在DAO外管理,就比较麻烦。透明有一篇文章,使用Spring在DAO外部管理事务,你可以参考一下,他的网站上有的。 有同感, 现在就是这样的情况,不晓得怎么处理。个人倾向于使用长事务的处理方法:即把事务管理放到DAO外面,但是这样处理很麻烦,感觉不晓得怎么下手。 在hibernate论坛上有个贴子也谈到了这个问题,就像无明所说,很多人都建议采用Spring来进行事务管理: http://forum.hibernate.org/viewtopic.php?t=925108 |
|
返回顶楼 | |
发表时间:2004-02-20
DAO里面实现的是原子操作,一个事务操作换句话说也可以看作是一次完整的业务操作(当然是对于业务系统来说的),所以事务应该放在业务处理层,也就是Facade层进行。简单地说就是放在SessionBean或者JavaBean当中进行。
楼上刚才问怎么进行事务处理,如果是SessionBean,就不要说了,选择Required,会自动具有事务属性。如果是JavaBean,那么我们可以采用两种方式进行处理了。第一种,也就是资源共享,说白了,一般系统的事务就是访问数据库(如果包括IO或者其他就复杂了),那么要进行一个事务,就是要保证在javaBean中调用的DAO所采用的数据库链接是同一个,也就是达到链接的共享,这个方法,应该不要再明说了吧。第二种,比较复杂,也就是采用模拟EJB容器调用EJB的方式,delegate层调用的是一个facade接口,那么通过proxy模式,定向到到容器类,通过Template模式自动加载事务的前后缀(其实也就是开始事务、结束事务),同时通过Java的反射机制(或者通过proxy模式)具体JavaBean实现,这个时候,在调用DAO的时候就不需要考虑数据库链接了(但是要保证DAO的数据库链接来自于容器类)。 |
|
返回顶楼 | |
发表时间: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文章观点,但是我不觉得他对这些问题的解决办法很好。 谢谢 |
|
返回顶楼 | |
发表时间:2004-02-21
凤舞凰扬的意思就是自己写个session bean事务管理一样的东西吧
不管你操作多少个DAO,最后你应该有个体现业务逻辑的facade, 事务应该围绕在这个facede周围啊 事务对于DAO而言,应该是透明的 网上有那么多的AOP framework 不知道有没有用来做事务管理的 |
|
返回顶楼 | |
发表时间:2004-02-21
参考一下这个吧:
http://xglw.51.net/5team/springframework/viewtopic.php?t=156&highlight= 透明的网站,里面有他提到的几篇文章及源码: http://gigix.cool2u.net/ |
|
返回顶楼 | |
发表时间:2004-02-21
谢谢无明提供一个不错的网站。
在hibernate网站上找到这篇文章, 浏览了一遍,感觉spring与hibernate集成很好(没有学习过spring)。 按照文档说的,这样事务操作交给了spring。 http://www.hibernate.org/110.html |
|
返回顶楼 | |
发表时间:2004-02-21
楼上xangd说得对,事务对于DAO来说应该是透明的,事务应该是在Facade层,包括事务的开始,提交,回滚都应该在Facade层处理,当然Facade层可以是简单的javaBean。
比如你的DAO的构造的时候,它所需要的数据库链接是由Facade层传入的,那么多个DAO传入的都是一个链接,在Facade里控制链接的事务属性。当然,考虑到封装和移植,这种链接是采用接口的形式,不一定是数据库链接。 |
|
返回顶楼 | |