该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-16
archerfrank 写道 没有成员变量,这样的DAO现在很少用了吧。 是否在DAO中使用成员变量,主要看对系统采用哪种设计模型,没有绝对的,这应该不牵涉到对ThreadLocal的使用, BTW,从设计上讲,DAO应该是无状态的比较合理。业务逻辑状态应该由Service(或者叫Biz)层保持,否则DAO还叫DAO嘛? DAO只因该负责数据访问才是,这也是它名字的由来啊。 如果将Model Bean和DAO放一块,这种设计通常有争议的,因为OOD中的一条准则是每个类只因该负责一个功能,或者说类改变的原因应该只有一种。当然这个不是绝对的,否则就不存在争议了。 |
|
返回顶楼 | |
发表时间:2009-11-16
linliangyi2007 写道 是否在DAO中使用成员变量,主要看对系统采用哪种设计模型,没有绝对的,这应该不牵涉到对ThreadLocal的使用, BTW,从设计上讲,DAO应该是无状态的比较合理。业务逻辑状态应该由Service(或者叫Biz)层保持,否则DAO还叫DAO嘛? DAO只因该负责数据访问才是,这也是它名字的由来啊。 如果将Model Bean和DAO放一块,这种设计通常有争议的,因为OOD中的一条准则是每个类只因该负责一个功能,或者说类改变的原因应该只有一种。当然这个不是绝对的,否则就不存在争议了。 状态是要在biz保持。 |
|
返回顶楼 | |
发表时间:2009-11-20
ThreadLocal的应用已经相当广泛了~~
ps:此贴好像没结束~~spring的事务管理是个幌子? |
|
返回顶楼 | |
发表时间:2009-11-21
mccxj 写道 ThreadLocal的应用已经相当广泛了~~
ps:此贴好像没结束~~spring的事务管理是个幌子? 帖子已更新,欢迎拍砖! |
|
返回顶楼 | |
发表时间:2010-01-31
# System.out.println("判断当前的事务环境,是应该提交事务还是回滚事务"); if (existsTransaction == false && TransactionHelper.isRollbackOnly() == false) { TransactionHelper.commit(); System.out.println("事务已提交"); } else if (existsTransaction == false && TransactionHelper.isRollbackOnly() == true) { TransactionHelper.rollback(); System.out.println("事务已回滚"); } else if (existsTransaction == true) { System.out.println("子事务忽略事务提交或回滚"); } 这里看的不是很明白 if(不存在开启的事务 && 事务不需要回滚) { then 提交事务 } ? 不存在事务还怎么commit? |
|
返回顶楼 | |
发表时间:2010-02-11
Zahir 写道 # System.out.println("判断当前的事务环境,是应该提交事务还是回滚事务"); if (existsTransaction == false && TransactionHelper.isRollbackOnly() == false) { TransactionHelper.commit(); System.out.println("事务已提交"); } else if (existsTransaction == false && TransactionHelper.isRollbackOnly() == true) { TransactionHelper.rollback(); System.out.println("事务已回滚"); } else if (existsTransaction == true) { System.out.println("子事务忽略事务提交或回滚"); } 这里看的不是很明白 if(不存在开启的事务 && 事务不需要回滚) { then 提交事务 } ? 不存在事务还怎么commit? 请联系这段代码再看看! // 在目标方法被调用前织入的逻辑,此处以Required传播属性为例 // 判断当前的事务环境,是开始一个新事务还是加入已有的事务 boolean existsTransaction = TransactionHelper.existsTransaction(); if (existsTransaction == false) { TransactionHelper.beginTransaction(); System.out.println("当前事务环境还没有事务,开启一个新事务"); } else { System.out.println("当前事务环境已存在事务,加入事务"); } RequiredTransactionInterceptor 的 invoke方法会有类似嵌套调用的过程,所以需要用动态的思想来看这段代码才能明白其意思。existsTransaction 的值在 外层方法中的值和内层方法中的值是不同的。 |
|
返回顶楼 | |
发表时间:2010-06-20
topxiaoke 写道 pipilu 写道 archerfrank 写道 pipilu 写道 楼上为什么有人在说DAO单例不单例的事呢?跟那有关系么?
关于本帖的主题,大家可以看一下:http://www.iteye.com/topic/481167#1191322 这里面mikewang的解答 如果是单例,不同的线程可能拿到同一个DAO,不tl,就可能被其他线程关闭了。而现在大家的DAO基本都是单例的。 对于DAO,只要没有成员变量(即可能被多个线程共享的变量),在Web应用中它就是线程安全的。 DAO单例不单例,跟用ThreadLocal没什么关系。先把基本概念搞清楚,别硬往上靠。 以前没用ThreadLocal时,大家都别写Web应用了? 这位仁兄的这个说法我非常赞成,只要我们不使用成员变量,就可以不用考虑线程安全问题。不使用ThreadLocal,我们的DAO也可以是单例的。 DAO 单例不单例是写法上的限制问题,我觉得他的单例形式必须得保证事务的相关性,那样单例才有意义,要不然只需把构造方法私有化就单例了。所以我就是想知道,如果不使用ThreadLocal 和全局Connection 变量 还可以做到具有事务相关性的单例吗? |
|
返回顶楼 | |