欢迎来到小米的博客
希望能和您交流Java编程的知识和见解
BlogJava
首页
新随笔
联系
聚合
管理
随笔-57 评论-202 文章-17 trackbacks-0
《深入浅出Hibernate》读书笔记(9)——Session管理
这一节是非常实用的一节,我在阅读此书的时候,一直在迷惑,究竟应该怎样管理Session呢?因为Session的管理是如此重要,类似于以前写程序对JDBC Connection的管理。看完此节后,终于找到了方法。
在各种Session管理方案中,ThreadLocal模式得到了大量使用。ThreadLocal是Java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM为每个运行的线程,绑定了私有的本定实例存取空间,从而为多线程环境经常出现的并发访问问题提供了一种隔离机制。
下面是Hibernate官方提供的一个ThreadLocal工具:
import net.sf.hibernate.
*
;
import net.sf.hibernate.cfg.
*
;
import org.apache.log4j.Logger;
/**/
/*
*
* <p>Title: </p>
*
* <p>Description: Session的管理类</p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author George Hill
* @version 1.0
*/
public
class
HibernateUtil
{
private
static
final Logger log
=
Logger.getLogger(HibernateUtil.
class
);
private
static
final SessionFactory sessionFactory;
/**/
/*
*
* 初始化Hibernate配置
*/
static
{
try
{
//
Create the SessionFactory
sessionFactory
=
new
Configuration().configure().buildSessionFactory();
}
catch
(Throwable ex)
{
log.error(
"
Initial SessionFactory creation failed.
"
, ex);
throw
new
ExceptionInInitializerError(ex);
}
}
public
static
final ThreadLocal session
=
new
ThreadLocal();
/**/
/*
*
* 根据当前线程获取相应的Session
* @return Session
* @throws HibernateException
*/
public
static
Session currentSession() throws HibernateException
{
Session s
=
(Session) session.
get
();
//
Open a new Session, if this Thread has none yet
if
(s
==
null
)
{
s
=
sessionFactory.openSession();
session.
set
(s);
}
return
s;
}
/**/
/*
*
* 返回Session给相应的线程
* @throws HibernateException
*/
public
static
void
closeSession() throws HibernateException
{
Session s
=
(Session) session.
get
();
session.
set
(
null
);
if
(s
!=
null
)
s.close();
}
}
针对WEB程序,还可以利用Servlet2.3的Filter机制,轻松实现线程生命周期内的Session管理。下面是一个通过Filter进行Session管理的典型案例:
public
class
PersistenceFilter implements Filter
{
protected
static
ThreadLocal hibernateHolder
=
new
ThreadLocal();
public
void
doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
hibernateHolder.
set
(getSession());
try
{
chain.doFilter(request, response);
}
finally
{
Session session
=
(Session) hibernateHolder.
get
();
if
(session
!=
null
)
{
hibernateHolder.
set
(
null
);
try
{
session.close();
}
catch
(HibernateException ex)
{
throw
new
ServletException(ex);
}
}
}
}
}
posted on 2005-07-29 19:43
小米
阅读(3926)
评论(1)
编辑
收藏
所属分类:
Hibernate
评论:
#
re: 《深入浅出Hibernate》读书笔记(9)——Session管理
2005-11-06 15:07 |
jiniboy
这都是你总结的吗
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
《深入浅出Hibernate》读书笔记(9)——Session管理
《深入浅出Hibernate》读书笔记(8)——Hibernate分页
《深入浅出Hibernate》读书笔记(7)——回调与拦截机制
《深入浅出Hibernate》读书笔记(6)——集合类型和结果集排序
《深入浅出Hibernate》读书笔记(5)——持久层操作
《深入浅出Hibernate》读书笔记(4)——事务管理
《深入浅出Hibernate》读书笔记(3)——数据缓存
《深入浅出Hibernate》读书笔记(2)——实体对象识别
《深入浅出Hibernate》读书笔记(1)——实体对象生命周期
用HQL获取部分的实体对象属性
小米,生活在深圳,专注于Java,主要从事数据库和网页编程。现在在学习着Hibernate和Spring。喜欢游戏、音乐和台球。联系方式:georgehill@21cn.com
<
2005年7月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(27)
给我留言
查看公开留言
查看私人留言
随笔分类
Hibernate(15)
Java(17)
Spring(1)
Struts(5)
其它(5)
数据库(2)
生活随笔(12)
随笔档案
2006年4月 (1)
2006年3月 (1)
2005年8月 (1)
2005年7月 (11)
2005年6月 (13)
2005年5月 (30)
文章分类
Eclipse(1)
Java(8)
其它(8)
文章档案
2005年7月 (1)
2005年6月 (13)
2005年5月 (3)
我的朋友们
emu的博客
Java BY
我的链接
Java Research
SUN Java技术中文社区
拯救程序员王俊
搜索
积分与排名
积分 - 231777
排名 - 246
最新评论
1. re: Hibernate的一对一关联实例
根据写了报错了是怎么回事
--33
2. re: 用java.util.Timer定时执行任务
评论内容较长,点击标题查看
--yunp
3. re: Hibernate的一对一关联实例
好样的
--vds
4. re: 如何在Struts中实现分页显示数据(1)
PageData中的集合是所有都取出,还是用多少取多少,若是前者,会拖慢系统的。
--李亚男
5. re: BMP文件格式
评论内容较长,点击标题查看
--见面
阅读排行榜
1. 用java.util.Timer定时执行任务(33712)
2. 用JFreeChart画柱状图的范例(10680)
3. 《深入浅出Hibernate》读书笔记(3)——数据缓存(6093)
4. 《深入浅出Hibernate》读书笔记(8)——Hibernate分页(5529)
5. 用ChartDirector在JSP中画统计图(5230)
评论排行榜
1. 如何在Struts中实现分页显示数据(2)(25)
2. 献出一份爱心 共同援助重病程序员王俊(22)
3. Struts的国际化完整解决方案(11)
4. 2005年6月27日,一个值得纪念的日子(9)
5. 《深入浅出Hibernate》读书笔记(1)——实体对象生命周期(9)