精华帖 (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? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-10-05
ThreadLocal实际上是一个类似HashMap的东西,这个HashMap的key就是Thread.currentThread(),而value就是你放进去的东西。所以说每次当你从ThreadLocal Variable中取对象的时候,你是默认拿自己当前的currentThread做为key去查找对应的value对象的。因此不管被运行的代码跨越了多少class,只要在1次运行的thread中的代码取到的都是同一个对象。
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2003-10-05
程序写的没有错,应该是你的sf没有取到。
|
|
返回顶楼 | |
发表时间:2003-10-08
robbin 写道 程序写的没有错,应该是你的sf没有取到。
不,是下面这句话没有通过: Session s = (Session); session.get();; session为null. 不知道为什么 |
|
返回顶楼 | |
发表时间: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);; |
|
返回顶楼 | |
发表时间:2003-10-08
不是s为空啊,是session.get()执行错误,也就是说session为空,所以session.get()就抛错啦
|
|
返回顶楼 | |
发表时间: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();; } } |
|
返回顶楼 | |
发表时间:2003-10-08
还是不懂那
和我最上面的那个写的应该是一样的亚 你是currentThread 我用的是session 感觉好象是调用的时候没有执行 private static final ThreadLocal currentThread = new ThreadLocal();; 请问用另外的一个类作如下调用: HibernateSession.openSession()就可以得到session了么,currentThread 在什么时候被实例化了的啊。 |
|
返回顶楼 | |
发表时间:2003-10-09
o ,明白了
|
|
返回顶楼 | |