论坛首页 Java企业应用论坛

浅谈Spring声明式事务管理ThreadLocal和JDKProxy

浏览 30127 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-11-16  
archerfrank 写道

没有成员变量,这样的DAO现在很少用了吧。


是否在DAO中使用成员变量,主要看对系统采用哪种设计模型,没有绝对的,这应该不牵涉到对ThreadLocal的使用,
BTW,从设计上讲,DAO应该是无状态的比较合理。业务逻辑状态应该由Service(或者叫Biz)层保持,否则DAO还叫DAO嘛?
DAO只因该负责数据访问才是,这也是它名字的由来啊。

如果将Model Bean和DAO放一块,这种设计通常有争议的,因为OOD中的一条准则是每个类只因该负责一个功能,或者说类改变的原因应该只有一种。当然这个不是绝对的,否则就不存在争议了。
1 请登录后投票
   发表时间:2009-11-16  
linliangyi2007 写道

是否在DAO中使用成员变量,主要看对系统采用哪种设计模型,没有绝对的,这应该不牵涉到对ThreadLocal的使用,
BTW,从设计上讲,DAO应该是无状态的比较合理。业务逻辑状态应该由Service(或者叫Biz)层保持,否则DAO还叫DAO嘛?
DAO只因该负责数据访问才是,这也是它名字的由来啊。

如果将Model Bean和DAO放一块,这种设计通常有争议的,因为OOD中的一条准则是每个类只因该负责一个功能,或者说类改变的原因应该只有一种。当然这个不是绝对的,否则就不存在争议了。

状态是要在biz保持。
0 请登录后投票
   发表时间:2009-11-20  
ThreadLocal的应用已经相当广泛了~~
ps:此贴好像没结束~~spring的事务管理是个幌子?
0 请登录后投票
   发表时间:2009-11-21  
mccxj 写道
ThreadLocal的应用已经相当广泛了~~
ps:此贴好像没结束~~spring的事务管理是个幌子?


帖子已更新,欢迎拍砖!
0 请登录后投票
   发表时间: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?
0 请登录后投票
   发表时间: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 的值在 外层方法中的值和内层方法中的值是不同的。
0 请登录后投票
   发表时间: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 变量 还可以做到具有事务相关性的单例吗?
0 请登录后投票
论坛首页 Java企业应用版

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