论坛首页 Java企业应用论坛

在B/S应用中用ThreadLocal管理Connection是否可取

浏览 15818 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-04-21  
事务可以用AOP的方式阿
其实G-roller和Spring中的HibernateTemplate都是不错的选择,可以看代码,还是利用ThreadLocal来解决的,不过加了个Intercepter
0 请登录后投票
   发表时间:2004-04-21  
AOP太前卫了,不敢用。。。

回头再研究一下spring先
0 请登录后投票
   发表时间:2004-04-23  
robbin 写道
如果该DAO需要一个细颗粒度的事务的话,那么你就

Session session = HibernateSession.currentSession();;
HibernateSession.currentTransaction();;
.....
session.flush();;
HibernateSession.commitTransaction();;

这样就可以实现一个细颗粒度的事务,而且在该线程执行序列中,接下去的另一个方法调用也是类似:


最好加一句HibernateSession.commitTransaction()吧。
Session session = HibernateSession.currentSession();
HibernateSession.commitTransaction();
HibernateSession.currentTransaction();
.....
session.flush();
HibernateSession.commitTransaction();
0 请登录后投票
   发表时间:2004-05-25  
那么如果DAO类是想做成通用的话,不止是在web应用,而是SWT或者Swing的Application,那么我就要修改这些类的每一个方法咯?

那我还是细粒度吧,哈哈
0 请登录后投票
   发表时间:2004-05-27  
其实用ThreadLocal来管一些本次操作的东西很有用(就是说一些只有本次操作需要共享的,但是用完后又想丢的).
ThreadLocal特别适合web程序,因为它每次的请求都是另开线程的(application程序我没有研究过,本人也没有开发过C/S,不好说).
不过我敢肯定Filter管理一定是超粗粒度,但ThreadLocal不是.
上面实现的HibernateSession代码并不好,因为它还要每次显式地获得事务(请注意JTA与JDBC的事务不同),所以写出的代码就.....
所以我觉得在每次获得session时给它传入一个参数,是参与事务,还是不参与等(不参与就重新分配一个session和开一个事务,默认是当没有事务时,重新开启一个,如果有就参与,这个参数有点像EJB的CMT类型),这样子就可以有效地控制事务的范围,并不是一棒打死掉.

其实用AOP管理最好,因为上面的DAO还是要显示地调用关闭session(当然用Filter不用,但太粗粒度了).

不过我试过了很多AOP都觉得不是很好用,像JBOSS的AOP一定要有它的容器中才方便,要不就要显式调用classLoador.AJ它是静态的.关于spring的AOP,我觉得每次调用那些所以的getBean(..)很烦,再说,spring的配置竟然只有运行到那一刻才知道是否出错了(如果你没有调用那个Bean,就算是配置出错了,它都不知道).naning和另一个aspectwerkz2在研究中....
当然AOP方面我只是试了一下,并没有深入研究每一个AOP.
上面也是我片面之词.如有说错,请原谅.
0 请登录后投票
   发表时间:2004-05-27  
补:用AOP类型的东西,很容易做出一个简单的声明式事务(没有用CGLIB之类的)
0 请登录后投票
论坛首页 Java企业应用版

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