ThreadLocal关键

07-09-06 leoyu

这是一个网友用threadlocal管理JDBC连接的一个例子,大家认为这样的管理是否存在安全问题?对于高性能,高安全的环境下是否可行?

         

slangmgh
2007-09-06 12:48
理论上,这种用法没有问题,只要保证你的服务是在同一个线程中执行的。

关于性能,ThreadLocal的使用不会产生什么问题,也不存在多线程之间的竞争情况。

从代码的可靠性角度来考虑,其中有不少不足的地方。譬如对连接的获取,最好做一个Wrapper,保证不会被意外的关闭。另外,还需要保证服务结束的时候确保事务结束,连接关闭的机制。

leoyu
2007-09-06 14:12
最好做一个Wrapper,保证不会被意外的关闭

能否给出你示意意的代码.

假设:一个用户执行一个功能,这个功能有JDBC事务.可能执行时间是10秒.而在这十秒还没执行完,这个用户再点了另一功能,而另一功能所打开的连接则是上一功能的功能对象,我认为这样可能会使同一个连接对象出现混乱,事务出现混乱.

不知道slangmgh 担心的是否是我说的这个问题,或者其它问题

[该贴被leoyu于2007年09月06日 14:24修改过]

leoyu
2007-09-06 14:30
况且现在的容器如TOMCAT,自身有线程池,假如程序中某个地方忘了清除threadlocal中的连接对象,这样应该也会出现连接对象混乱,事务混乱了.(当然这点只有程序员自己注意,比如finally中关闭).但对于这些问题,要做到多线程,并发,threadlocal中对象的安全独立性感觉有点难度

slangmgh
2007-09-06 16:18
>最好做一个Wrapper,保证不会被意外的关闭

>能否给出你示意意的代码.

很简单,你可以用聚合的方式实现一个Connection接口,把该类的close方法设置成什么都不做就可以了。然后在返回连接的时候返回该类的实例。

>假设:一个用户执行一个功能,这个功能有JDBC事务.可能执行时间是10秒.而在这十秒还没执行完,这个用户再点了另一功能,而另一功能所打开的连接则是上一功能的功能对象,我认为这样可能会使同一个连接对象出现混乱,事务出现混乱.

这个没有关系,因为webapp将分配给你新的线程执行你的请求,在该线程中,获取连接的时候就会是新的连接了(这就是ThreadLocal的作用,每个线程只能获取自己设置的变量)。如果你同时有10个请求在执行,那么只有一个ThreadLocal变量,但是不同的线程从该ThreadLocal中获取的对象是不同的。

猜你喜欢
2Go 1 2 下一页