ThreadLocal关键
这是一个网友用threadlocal管理JDBC连接的一个例子,大家认为这样的管理是否存在安全问题?对于高性能,高安全的环境下是否可行?
关于性能,ThreadLocal的使用不会产生什么问题,也不存在多线程之间的竞争情况。
从代码的可靠性角度来考虑,其中有不少不足的地方。譬如对连接的获取,最好做一个Wrapper,保证不会被意外的关闭。另外,还需要保证服务结束的时候确保事务结束,连接关闭的机制。
能否给出你示意意的代码.
假设:一个用户执行一个功能,这个功能有JDBC事务.可能执行时间是10秒.而在这十秒还没执行完,这个用户再点了另一功能,而另一功能所打开的连接则是上一功能的功能对象,我认为这样可能会使同一个连接对象出现混乱,事务出现混乱.
不知道slangmgh 担心的是否是我说的这个问题,或者其它问题
[该贴被leoyu于2007年09月06日 14:24修改过]
很简单,你可以用聚合的方式实现一个Connection接口,把该类的close方法设置成什么都不做就可以了。然后在返回连接的时候返回该类的实例。
>假设:一个用户执行一个功能,这个功能有JDBC事务.可能执行时间是10秒.而在这十秒还没执行完,这个用户再点了另一功能,而另一功能所打开的连接则是上一功能的功能对象,我认为这样可能会使同一个连接对象出现混乱,事务出现混乱.
这个没有关系,因为webapp将分配给你新的线程执行你的请求,在该线程中,获取连接的时候就会是新的连接了(这就是ThreadLocal的作用,每个线程只能获取自己设置的变量)。如果你同时有10个请求在执行,那么只有一个ThreadLocal变量,但是不同的线程从该ThreadLocal中获取的对象是不同的。
这个问题很关键,要做到这一点,你最好在框架中统一处理,譬如在调用服务前执行开始事务,在服务执行完成后,根据服务执行结果处理事务是否提交或者回滚。如果将它交给每个服务本身来做,会出现问题的。
所有的框架都会有这个问题(如果将事务处理交给应用自己处理的话)。
>但对于这些问题,要做到多线程,并发,threadlocal中对象的安全独立性感觉有点难度
应该没有你想像的那么难。你需要对多线程这个概念再理解的透一点。
比如我最近在JdonFramework中支持Hibernate3工作中,将HIbernate的Session保存到ThreadLocal中,然后做一个CloseSessionInViewFilter,在最后将threadLocal中对象进行清除,包括事务进行commit。这不象Spring的OpenSessionInViewFilter,我认为Session可以有应用程序自己打开,不必在表现层就打开,但是关闭必须有一个总阀门关闭,这样,可以充分利用Hibernate的懒加载机制,这个机制是很有魅力的,但是需要Session一直打开。
正确,所以需要ThreadLocal。