论坛首页 Java企业应用论坛

再深入的问一下ThreadLocal的问题!

浏览 12862 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-10-05  
我看了一下http://hibernate.bluemars.net/42.html给的ThreadLocal的例子,但还是有些问题不明白,请大家讨论一下!

(1) 我也看了一下http://www-106.ibm.com/developerworks/java/library/j-threads3.html上有关ThreadLocal的说明,还不是特别明白,是否ThreadLocal就是将一个变量与某个线程联系在一起,这样这个变量就可以为某个线程使用了?
(2) 使用在Hibernate上,在上面所提的例子中,每个线程使用的是不同的Session实例?如果是不同的话,我每次调用完currentSession后,是否还需要再调用closeSession来关闭Session?
   发表时间:2003-10-05  
ThreadLocal实际上是一个类似HashMap的东西,这个HashMap的key就是Thread.currentThread(),而value就是你放进去的东西。所以说每次当你从ThreadLocal Variable中取对象的时候,你是默认拿自己当前的currentThread做为key去查找对应的value对象的。因此不管被运行的代码跨越了多少class,只要在1次运行的thread中的代码取到的都是同一个对象。
0 请登录后投票
   发表时间:2003-10-05  
这段代码;
public class HibernateSession {

   public static final ThreadLocal session = new ThreadLocal();;
   
    public static Session currentSession();
        throws NamingException, HibernateException {

      Session s = (Session); session.get();;
      if (s == null); {
         SessionFactory sf = (SessionFactory); new InitialContext();.lookup("SessionFactory");;
         s = sf.openSession();;
         session.set(s);;
      }
      return s;
    }

    public static void closeSession(); throws HibernateException {
       Session s = (Session); session.get();;
       session.set(null);;
       if (s != null); s.close();;
    }
}

我用HibernateSession.currentSession()的根本get不到session是怎么回事啊.我看了一下,好像下面这句通不过
Session s = (Session) session.get();

session为null.
我不知道为啥,前面不是有
   public static final ThreadLocal session = new ThreadLocal();了么
大家怎么在SB使用ThreadLocal 的阿
Thanks
0 请登录后投票
   发表时间:2003-10-05  
程序写的没有错,应该是你的sf没有取到。
0 请登录后投票
   发表时间:2003-10-08  
robbin 写道
程序写的没有错,应该是你的sf没有取到。

不,是下面这句话没有通过:
Session s = (Session); session.get();; 

session为null.
不知道为什么
0 请登录后投票
   发表时间:2003-10-08  
如果session s 为 空, 那它会执行以下代码, 请跟一下以下的代码, 看session.set(s) 中的s 为不为空?

if (s == null); { 
         SessionFactory sf = (SessionFactory); new InitialContext();.lookup("SessionFactory");; 
         s = sf.openSession();; 
         session.set(s);;
0 请登录后投票
   发表时间:2003-10-08  
不是s为空啊,是session.get()执行错误,也就是说session为空,所以session.get()就抛错啦
0 请登录后投票
   发表时间:2003-10-08  
你自已把程序写错了.
看看下面正确的代码:
public class HibernateSession {

  private static final ThreadLocal currentThread = new ThreadLocal();;

  public static synchronized Session openSession(); throws HibernateException {
    Session s = (Session); currentThread.get();;
    if (s == null); {
      s = HibernateSessionFactory.getSessionFactory();.openSession();;
      currentThread.set(s);;
    }
    return s;
  }

  public static void closeSession(); throws HibernateException {
    Session s = (Session); currentThread.get();;
    currentThread.set(null);;
    if (s != null); s.close();;
  }
}
0 请登录后投票
   发表时间:2003-10-08  
还是不懂那
和我最上面的那个写的应该是一样的亚
你是currentThread
我用的是session

感觉好象是调用的时候没有执行
private static final ThreadLocal currentThread = new ThreadLocal();; 


请问用另外的一个类作如下调用:

HibernateSession.openSession()就可以得到session了么,currentThread 在什么时候被实例化了的啊。
0 请登录后投票
   发表时间:2003-10-09  
o ,明白了
0 请登录后投票
论坛首页 Java企业应用版

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