论坛首页 Java企业应用论坛

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

浏览 30128 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-11-14  
archerfrank 写道
pipilu 写道
楼上为什么有人在说DAO单例不单例的事呢?跟那有关系么?

关于本帖的主题,大家可以看一下:http://www.iteye.com/topic/481167#1191322 这里面mikewang的解答

如果是单例,不同的线程可能拿到同一个DAO,不tl,就可能被其他线程关闭了。而现在大家的DAO基本都是单例的。


对于DAO,只要没有成员变量(即可能被多个线程共享的变量),在Web应用中它就是线程安全的。
DAO单例不单例,跟用ThreadLocal没什么关系。先把基本概念搞清楚,别硬往上靠。
以前没用ThreadLocal时,大家都别写Web应用了?
0 请登录后投票
   发表时间:2009-11-14   最后修改:2009-11-14
topxiaoke 写道
archerfrank 写道
pipilu 写道
楼上为什么有人在说DAO单例不单例的事呢?跟那有关系么?

关于本帖的主题,大家可以看一下:http://www.iteye.com/topic/481167#1191322 这里面mikewang的解答

如果是单例,不同的线程可能拿到同一个DAO,不tl,就可能被其他线程关闭了。而现在大家的DAO基本都是单例的。


我也不太赞成  mikewang  说的
引用至http://www.iteye.com/topic/481167#1191322
至于为什么要用ThreaLocal,通常是解决在分层设计中, 对于 ra 的处理通常比较棘手, 具体表现在跨层操作时候的参数传递上。


如果只是为了解决跨层的参数传递而使是用ThreadLocal,违反了ThreadLocal设计的实际用意,如果不考虑多线程,完全可以用一个全局变量在各层中传递参数。


这明显抬扛了,谁说不考虑并发了?你真要反驳,请提出个不必把Connection或session通过参数传递到DAO的各个方法,而且又能线程安全的办法。
你根本就没有理解ThreadLocal Pattern
0 请登录后投票
   发表时间:2009-11-14  
pipilu 写道
topxiaoke 写道
archerfrank 写道
pipilu 写道
楼上为什么有人在说DAO单例不单例的事呢?跟那有关系么?

关于本帖的主题,大家可以看一下:http://www.iteye.com/topic/481167#1191322 这里面mikewang的解答

如果是单例,不同的线程可能拿到同一个DAO,不tl,就可能被其他线程关闭了。而现在大家的DAO基本都是单例的。


我也不太赞成  mikewang  说的
引用至http://www.iteye.com/topic/481167#1191322
至于为什么要用ThreaLocal,通常是解决在分层设计中, 对于 ra 的处理通常比较棘手, 具体表现在跨层操作时候的参数传递上。


如果只是为了解决跨层的参数传递而使是用ThreadLocal,违反了ThreadLocal设计的实际用意,如果不考虑多线程,完全可以用一个全局变量在各层中传递参数。


这明显抬扛了,谁说不考虑并发了?你真要反驳,请提出个不必把Connection或session通过参数传递到DAO的各个方法,而且又能线程安全的办法。
你根本就没有理解ThreadLocal Pattern


他不是说了吗?用全局变量传递啊,
真想看看这个用全局变量传递connection的应用跑起来是什么样的。。
0 请登录后投票
   发表时间:2009-11-15  
xieke 写道
pipilu 写道
topxiaoke 写道
archerfrank 写道
pipilu 写道
楼上为什么有人在说DAO单例不单例的事呢?跟那有关系么?

关于本帖的主题,大家可以看一下:http://www.iteye.com/topic/481167#1191322 这里面mikewang的解答

如果是单例,不同的线程可能拿到同一个DAO,不tl,就可能被其他线程关闭了。而现在大家的DAO基本都是单例的。


我也不太赞成  mikewang  说的
引用至http://www.iteye.com/topic/481167#1191322
至于为什么要用ThreaLocal,通常是解决在分层设计中, 对于 ra 的处理通常比较棘手, 具体表现在跨层操作时候的参数传递上。


如果只是为了解决跨层的参数传递而使是用ThreadLocal,违反了ThreadLocal设计的实际用意,如果不考虑多线程,完全可以用一个全局变量在各层中传递参数。


这明显抬扛了,谁说不考虑并发了?你真要反驳,请提出个不必把Connection或session通过参数传递到DAO的各个方法,而且又能线程安全的办法。
你根本就没有理解ThreadLocal Pattern


他不是说了吗?用全局变量传递啊,
真想看看这个用全局变量传递connection的应用跑起来是什么样的。。


使用全局变量的connection和ThreadLocal的Connection有本质区别,一个是全局单例,一个是对线程单例。全局单例在并发上就彻底乱套了。

BTW:这个贴不应该是隐藏贴,大家的讨论很有代表性。
0 请登录后投票
   发表时间:2009-11-15  
pipilu 写道
archerfrank 写道
pipilu 写道
楼上为什么有人在说DAO单例不单例的事呢?跟那有关系么?

关于本帖的主题,大家可以看一下:http://www.iteye.com/topic/481167#1191322 这里面mikewang的解答

如果是单例,不同的线程可能拿到同一个DAO,不tl,就可能被其他线程关闭了。而现在大家的DAO基本都是单例的。


对于DAO,只要没有成员变量(即可能被多个线程共享的变量),在Web应用中它就是线程安全的。
DAO单例不单例,跟用ThreadLocal没什么关系。先把基本概念搞清楚,别硬往上靠。
以前没用ThreadLocal时,大家都别写Web应用了?


这位仁兄的这个说法我非常赞成,只要我们不使用成员变量,就可以不用考虑线程安全问题。不使用ThreadLocal,我们的DAO也可以是单例的。
0 请登录后投票
   发表时间:2009-11-15  
多线程共享一个单利的dao,如上楼主所说,就ok,否则那就是现成安全的,就把dao当做一个工具得了,不要再往dao里塞那么多特殊化的东西,自找麻烦,
0 请登录后投票
   发表时间:2009-11-15  
谢谢LZ,看完贴子,收获不少,ThreadLocal跟DAO用不用单例没什么关系,ThreadLocal是用来解决同一个线程中不同方法间connection传递的问题,而又可以保证该connection对别的线程不可见,Spring大概就是借助了这个来实现声明式事务的吧
0 请登录后投票
   发表时间:2009-11-16  
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功能肯定很弱吧?
0 请登录后投票
   发表时间:2009-11-16  
linliangyi2007 写道
xieke 写道
pipilu 写道
topxiaoke 写道
archerfrank 写道
pipilu 写道
楼上为什么有人在说DAO单例不单例的事呢?跟那有关系么?

关于本帖的主题,大家可以看一下:http://www.iteye.com/topic/481167#1191322 这里面mikewang的解答

如果是单例,不同的线程可能拿到同一个DAO,不tl,就可能被其他线程关闭了。而现在大家的DAO基本都是单例的。


我也不太赞成  mikewang  说的
引用至http://www.iteye.com/topic/481167#1191322
至于为什么要用ThreaLocal,通常是解决在分层设计中, 对于 ra 的处理通常比较棘手, 具体表现在跨层操作时候的参数传递上。


如果只是为了解决跨层的参数传递而使是用ThreadLocal,违反了ThreadLocal设计的实际用意,如果不考虑多线程,完全可以用一个全局变量在各层中传递参数。


这明显抬扛了,谁说不考虑并发了?你真要反驳,请提出个不必把Connection或session通过参数传递到DAO的各个方法,而且又能线程安全的办法。
你根本就没有理解ThreadLocal Pattern


他不是说了吗?用全局变量传递啊,
真想看看这个用全局变量传递connection的应用跑起来是什么样的。。


使用全局变量的connection和ThreadLocal的Connection有本质区别,一个是全局单例,一个是对线程单例。全局单例在并发上就彻底乱套了。

BTW:这个贴不应该是隐藏贴,大家的讨论很有代表性。


顶 赞同linliangyi2007的见解。
0 请登录后投票
   发表时间:2009-11-16  
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现在很少用了吧。
0 请登录后投票
论坛首页 Java企业应用版

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