﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-只要一直往前走，我们还是会见面的。。。-文章分类-j2ee技术</title><link>http://www.blogjava.net/carry_tang/category/2818.html</link><description>－－－世界的尽头，缘是你</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 03:24:23 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 03:24:23 GMT</pubDate><ttl>60</ttl><item><title>网上很多应用LocalThread,今天也试试</title><link>http://www.blogjava.net/carry_tang/articles/10466.html</link><dc:creator>java time</dc:creator><author>java time</author><pubDate>Thu, 18 Aug 2005 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/carry_tang/articles/10466.html</guid><wfw:comment>http://www.blogjava.net/carry_tang/comments/10466.html</wfw:comment><comments>http://www.blogjava.net/carry_tang/articles/10466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/carry_tang/comments/commentRss/10466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/carry_tang/services/trackbacks/10466.html</trackback:ping><description><![CDATA[今天遇到了一个问题，就是当初设计系统的时候，本来只用一个数据库的，<br />但由于用户新增的一些需求，必须要用两个数据库，而且要根据用户登陆选择的年份连接不同的数据库，大家知道会发生什么麻烦了吧，就是当初设计的数据库接口(dao层)都没有什么信息区分连接那个数据库的，但代码都已经写了好多，不可能每个修改每个调用的地方传入数据库信息（不是没可能，工作量大，而且时间紧项目都这样），得想个办法。<br />   在网上大概看过ThreadLocal的用法 ，看看ThreadLocal是什么：<br /><font color="#0000ff">ThreadLocal是什么</font><p><font style="BACKGROUND-COLOR: #ffffff" color="#0000ff">　　ThreadLocal是什么呢？其实ThreadLocal并非是一个线程的本地实现版本，它并不是一个Thread，而是thread local variable（线程局部变量）。也许把它命名为ThreadLocalVar更加合适。线程局部变量（ThreadLocal）其实的功用非常简单，就是为每一个使用该变量的线程都提供一个变量值的副本，是每一个线程都可以独立地改变自己的副本，而不会和其它线程的副本冲突。从线程的角度看，就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明，在其它的一些语言编译器实现（如IBM XL FORTRAN）中，它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持，而是提供了一个ThreadLocal的类来提供支持，所以，在Java中编写线程局部变量的代码相对比较笨拙，这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。<br /><br /><br /><font color="#000000">我们知道，对于每个请求容器都会开一个线程去处理，从servlet到数据库层都是同一个线程，通过ThreadLocal可以把变量在各个层共享，通过这一特性就可以解决我的问题了。<br />首先我实现一个filter(不知道什么是filter?)，使得所有请求都通过这个filter，在filter里面获取用户选择的年份，实际上通过年份就知道了连接哪个数据库，因为系统的数据源名称是通过年份来区分的，根据年份获得数据源名称(jndi name)，把jndi name存放在ThreadLocal里面。接着就要在获取数据库连接的地方获得这个jndi name。还好，程序员规范遵循得好（真的深深体会编码规范的重要性），大家统一调用同一个类来获得数据库连接，这就好办，在获取数据库连接的地方通过ThreadLocal取回jndi name,这样就获得了正确的数据库连接，代码改动量也不多。<br />ThreadLocal的代码如下，很简单:<br /><font color="#0000ff">public class DnsThread(){<br />   private static ThreadLocal tl=new ThreadLocal ();//私有静态变量 <br />   public static Object get(){<br />      return tl.get();<br />  }<br />  public static void set(Object object){<br />    tl.set(object);<br />  } <br />}<br /></font><br />在filter里面调用<br />DnsThread.set("dns2005");<br />在获取数据库连接的地方调用<br />String dns=(String)DnsThread.set("dns2005");<br /><br />这只是一个简单的应用，但它确实解决了实际问题<br />还有其他一些用法，像事务处理,通过共享Connection来实现<br /><br /><br /></font></font></p><img src ="http://www.blogjava.net/carry_tang/aggbug/10466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/carry_tang/" target="_blank">java time</a> 2005-08-19 00:34 <a href="http://www.blogjava.net/carry_tang/articles/10466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>