JiveJdon Community Forums
在线172人 J道首页 | 论坛首页 | 培训咨询 | 开源框架 | 精华 | 查搜 | 注册 | 登陆 |
首页 » 论坛 » 项目工程开发经验谈
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表
???en_US.forumThreadNext.name??? 下一主题
这个主题共有 33 回复 / 3 页 [ 1 2 3 下一页 ]  发表新帖子  回复该主题贴
艾云

发表文章: 4
注册时间: 2003年11月04日 21:20
DAO的困惑--事务处理 发表: 2004年10月14日 19:44 回复
我越来越困惑
先看看我的示例代码


方法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中的方法就加倍了,也觉得不好.

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

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

其实这也就是为什么要使用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中主要业务逻辑单独打包成一个类。

newold

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

发表文章: 4
注册时间: 2005年04月27日 14:06
Re: DAO的困惑--事务处理 发表: 2005年04月27日 14:08 回复
我一般用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 } }
antzl

发表文章: 4
注册时间: 2005年04月27日 14:06
Re: DAO的困惑--事务处理 发表: 2005年04月27日 14:13 回复
我一般用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();

}

}
SportsBaby1980

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

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

banq

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

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

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


hgwnet

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

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




mythmoon

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

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

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

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

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

发表文章: 141
注册时间: 2003年01月05日 14:36
Re: DAO的困惑--事务处理 发表: 2005年05月22日 16:19 回复
在一些很复杂的操作环境下直接使用dbc的反而更方便,跨数据库间的jdbc其实操作的差异是很小的,基本上以自行解决。看看Jive4.0,底层数据操作较之前有根本的发展,但仍然是用Jdbc来操作数据库,实际就是为了获得最大的灵活性。
这个主题有 33 回复 / 3 页 [ 1 2 3 下一页 ]
???en_US.forumThreadPrev.name??? 上一主题
Go back to the topic listing   返回主题列表    返回页首  返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Spring Struts
查询本论坛内 回复超过的热门帖子
快速发表回复
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-07 jdon.com

anti spam