ThreadLocal 在 Hibernate 中的应用
Hibernate的文档时看到了关于使ThreadLocal管理多线程访问的部分。具体代码如下
private static SessionFactory sf;
1。private static ThreadLocal<Session> session = new ThreadLocal<Session>();
private static SessionFactory getSessionFactory()
{
if (sf == null)
return new Configuration().configure().buildSessionFactory();
else
return sf;
}
2。public static Session currentSession()
{
Session s = session.get();
if (s == null)
{
s = getSessionFactory().openSession();
session.set(s);
return s;
}
return s;
}
3。public static void closeSession()
{
Session s = session.get();
if (s != null)
s.close();
session.set(null);
}
我们分析 一下:
1。 初始化一个ThreadLocal对象,ThreadLocal有三个成员方法 get()、set()、initialvalue()。
如果不初始化initialvalue,则initialvalue返回null。
3。session的get根据当前线程返回其对应的线程内部变量,也就是我们需要的net.sf.hibernate.Session(相当于对应每个数据库连接).多线程情况下共享数据库链接是不安全的。ThreadLocal保证了每个线程都有自己的s(数据库连接)。
5。如果是该线程初次访问,自然,s(数据库连接)会是null,接着创建一个Session,具体就是行6。
6。创建一个数据库连接实例 s
7。保存该数据库连接s到ThreadLocal中。
8。如果当前线程已经访问过数据库了,则从session中get()就可以获取该线程上次获取过的连接实例。
通过ThreadLocal,我们既实现了多线程并发,同时,也实现了SingleTon模式。一举两得。
- 14:20
- 浏览 (358)
- 评论 (0)
- 分类: Hibernate的东东
- 相关推荐
发表评论
- 浏览: 22909 次
- 性别:

- 来自: 青岛

- 详细资料
搜索本博客
我的相册
共 4 张
最新评论
-
JAVA数据类型转换
谢谢楼主,说的很详细,好好学习下!
-- by sky21 -
JAVA数据类型转换
虽然是基础的东西, 但能总结出来还不错, 虽然有某些欠缺
-- by zhanjia -
15位和18位身份证的正则表 ...
不错,我收藏了
-- by jasongreen -
15位和18位身份证的正则表 ...
不错,我收藏了
-- by jasongreen -
DOS中 Orcle9i服务的启动 ...
呵呵
-- by jiake0504






评论排行榜