jdon 解惑授道,企业信息化解决之道
 

热点Tag: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts

Jdon框架演示

JiveJdon3.0
源码下载

GoF设计模式

在线教程

社区精彩讨论












DAO的困惑--事务处理

作者:艾云 发表时间:2004年10月14日 19:44 回复此消息回复

原贴网址: http://www.jdon.com/jivejdon/thread/17055.html

我越来越困惑
先看看我的示例代码


方法1:
ADAO{

methodA(){

Connection con=ConnectionPool.getConnection();
//do some thing
methodB();
con.close();

}

methodB(){

Connection con=ConnectionPool.getConnection();
//do some thing
con.close();

}

}

方法2:
ADAO{

methodA(){

Connection con=ConnectionPool.getConnection();
//do methodA thing
//do metnodB thing
con.close();

}

methodB(){

Connection con=ConnectionPool.getConnection();
//do some thing
con.close();

}

}


方法3:
ADAO{

methodA(){

Connection con=ConnectionPool.getConnection();
//do methodA thing
methodB2(con);
con.close();

}

methodB(){

Connection con=ConnectionPool.getConnection();
methodB(con);
con.close();

}

methodB(Connection con){

//do methodB thing

}


}


就拿上面的代码来说,methodA和methodB()都可以被外界单独调用,在方法1中我们要完成methodA(),要创建两个Connection,且不说资源消耗,最大的问题是methodA和methodB不在一个Connection中而不好做事务化.

方法2虽然可以解决methodA和methodB的事务问题,但却在methodA中重复了一遍methodB的代码,个人感觉不好.

方法3虽然野可以解决事务问题而且可以重用代码,但是问题就是要多定义一个方法,如果所有的方法分开两个方法实现,DAO中的方法就加倍了,也觉得不好.

请问那种方法比较好呢,或者有更好的解决?

Re: DAO的困惑--事务处理 发表: 2004年10月19日 10:04 回复
banq 发表文章: 8929/ 注册时间: 2002年08月03日 17:08
非常经典的现实例子。

其实这也就是为什么要使用AOP的缘故,在目前解决方案中,AOP可以漂亮地解决这个问题。

下面以AspectJ为例子,当然使用其他AOPSpring或JBoss 3.0更简单,JBoss 3.0相当于使用EJB,缺省支持,无需Spring那样专门配置事务语句。

你的DAO代码写成如下:

ADAO{
methodA(){
Connection con=ConnectionPool.getConnection();
//do methodA thing
methodB2(con);
con.close();
}
methodB(){
Connection con=ConnectionPool.getConnection();
methodB(con);
con.close();
}
methodB(Connection con){
//do methodB thing}
}



public aspect Lock {

  ......
Connection con;

  public pointcut writeOperations():
    execution(public boolean ADAO.methodA()) ||
    execution(public boolean ADAO.methodB()) ) ;


  before() : writeOperations() {
//开始事务机制 advice body
    con=ConnectionPool.getConnection();
  }

  after() : writeOperations() {
//结束事务
     con.close();
  }

  ......
}

在不使用AOP情况下,你的第三个方案是比较合理的,建议将
methodB(Connection con){//do methodB thing}和mehtodA中主要业务逻辑单独打包成一个类。

Re: DAO的困惑--事务处理 发表: 2004年10月31日 10:25 回复
newold 发表文章: 48/ 注册时间: 2004年05月08日 09:31
DAO中打开con肯定不行,只能在EJB中打开,然后将con传入DAO,由EJB的机制来保证事务

Re: DAO的困惑--事务处理 发表: 2005年04月27日 14:08 回复
antzl 发表文章: 4/ 注册时间: 2005年04月27日 14:06
我一般用IOC解决类似问题,请大家讨论优缺点

ADAO{
methodA(){ Connection con=ConnectionPool.getConnection(); //do methodA thing methodB2(con); con.close(); } methodB(){ Connection con=ConnectionPool.getConnection(); methodB(con); con.close(); } methodB(Connection con){ //do methodB thing } }

Re: DAO的困惑--事务处理 发表: 2005年04月27日 14:13 回复
antzl 发表文章: 4/ 注册时间: 2005年04月27日 14:06
我一般用IOC解决类似问题,请大家讨论优缺点

ADAO{
methodA(Connection conn){
//do methodA thing
}
methodB(Connection conn){
//do methodB thing
}
}
ADAOManager{
methodDoAandB(){
Connection con=ConnectionPool.getConnection();
methodA(con);
methodB(con);
con.close();

}

}

Re: DAO的困惑--事务处理 发表: 2005年04月28日 00:45 回复
SportsBaby1980 发表文章: 244/ 注册时间: 2004年06月09日 16:52
Dao只能使用资源,而不应该管理资源。

也就是说,Dao可以使用Connection,但不能维护它----生成和关闭。

Re: DAO的困惑--事务处理 发表: 2005年05月14日 16:06 回复
banq 发表文章: 8929/ 注册时间: 2002年08月03日 17:08
这篇文章有参考作用:
借助 AOP 重构 DB2 数据库访问程序

Re: DAO的困惑--事务处理 发表: 2005年05月14日 19:14 回复
mythmoon 发表文章: 207/ 注册时间: 2005年03月21日 01:09
我觉得antzl提供的
IOC解决类似问题,很简洁,我还看的懂其它的我觉的就郁闷了!

Re: DAO的困惑--事务处理 发表: 2005年05月14日 21:19 回复
SportsBaby1980 发表文章: 244/ 注册时间: 2004年06月09日 16:52
我认为事务不要有dao来处理。
应该由业务方法处理


Re: DAO的困惑--事务处理 发表: 2005年05月15日 08:40 回复
hgwnet 发表文章: 141/ 注册时间: 2003年01月05日 14:36
DAO模式是多余的麻烦。哪怕用Hibernate,我也不参进所谓的dao

Re: DAO的困惑--事务处理 发表: 2005年05月16日 15:55 回复
大愚弱智 发表文章: 17/ 注册时间: 2004年09月16日 17:25
搞笑,你还使用jdbc,落后了。




Re: DAO的困惑--事务处理 发表: 2005年05月16日 18:32 回复
mythmoon 发表文章: 207/ 注册时间: 2005年03月21日 01:09
不用JDBC用什么!基本的东西还不是JDBC不要告诉我!是用mapping之类的

Re: DAO的困惑--事务处理 发表: 2005年05月19日 11:50 回复
leadyu 发表文章: 47/ 注册时间: 2005年03月29日 12:53
小弟也发表一下遇见哈。

其实,我觉得,有些东西未必简单的方法就不好,复杂的东西就一定更适用。要看具体的情况。
各种各样的技术无非就是发现简单或者底层的东西不好用了,就在上面包多一层,再不好用了,就再加一层。但是有时候这样带来的代价就是使使用更复杂化,灵活度更低,所以具体使用什么技术来实现不好说哪个好,哪个不好。

Re: DAO的困惑--事务处理 发表: 2005年05月19日 21:32 回复
kevinfield 发表文章: 21/ 注册时间: 2005年04月04日 12:57
我现在也很疑惑

以前一直用JDBC编写的,没有用什么O/R映射的框架
现在是不是落伍了???

Re: DAO的困惑--事务处理 发表: 2005年05月22日 16:19 回复
hgwnet 发表文章: 141/ 注册时间: 2003年01月05日 14:36
在一些很复杂的操作环境下直接使用dbc的反而更方便,跨数据库间的jdbc其实操作的差异是很小的,基本上以自行解决。看看Jive4.0,底层数据操作较之前有根本的发展,但仍然是用Jdbc来操作数据库,实际就是为了获得最大的灵活性。

这个主题共有 33 回复 / 3 页 [ 1 2 3 下一页 ]
 
上一篇: 讨论旧系统如何改造成面向OO的? 下一篇: struts1 vs struts2
 
查询本论坛 最热门帖子
快速发表回复:
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 
联系我们 | 关于我们 | RSS订阅 | 广告联系 | 网站地图 | 设为首页
Copyright (C) 2002-2007 Jdon.com, All Rights Reserved 版权所有 上海解道计算机技术有限公司
沪ICP备05018152号 如有意见请与我们联系 Powered by JdonFramework