SessionFactory.getCurrentSession与openSession的区别
SessionFactory.getCurrentSession与openSession的区别
1. 如果使用的是getCurrentSession来创建session的话,在commit后,session就自动被关闭了,
也就是不用再session.close()了。但是如果使用的是openSession方法创建的session的话,
那么必须显示的关闭session,也就是调用session.close()方法。这样commit后,session并没有关闭
2. getCurrentSession的使用可以参见hibernate\hibernate-3.2\doc\tutorial\src项目
3. 使用SessionFactory.getCurrentSession()需要在hibernate.cfg.xml中如下配置:
* 如果采用jdbc独立引用程序配置如下:
<property name="hibernate.current_session_context_class">thread</property>
* 如果采用了JTA事务配置如下
<property name="hibernate.current_session_context_class">jta</property>
利于ThreadLocal模式管理Session
早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序
时提供了一种新的选择。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,
而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)
其实的功用非常简单,就是为每一个使用某变量的线程都提供一个该变量值的副本,是每一个线程都可以独立地改变自己的副本,
而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,
用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):
public class HibernateUtil {
public static final ThreadLocal session =new ThreadLocal();
public static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession() throws HibernateException {
Session s = session.get();
if(s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = session.get();
if(s != null) {
s.close();
}
session.set(null);
}
}
SessionFactory.getCurrentSession与openSession的区别相关推荐
- Sessionfactory.getCurrentSession与 openSession() 的区别
1. getCurrentSession创建的session会和绑定到当前线程,而openSession不会. 2. getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而o ...
- hibernate 的SessionFactory的getCurrentSession 与 openSession() 的区别
1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会. 2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而ope ...
- getCurrentSession()与openSession()的区别?
1.getCurrentSession()与openSession()的区别? 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession(),创建 ...
- Hibernate getCurrentSession()和openSession()的区别
通过getCurrentSession()创建的Session会绑定到当前线程上:openSession()不会. 通过getCurrentSession()获取Session,首先是从当前上下文中寻 ...
- sessionFactory.getCurrent()和sessionFactory.openSession()的区别
sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时, hibernate将session绑定到当前线程,事务结束后,hibernate 将session ...
- 新Hibernate SessionFactory().getCurrentSession()猫腻
http://liusu.iteye.com/blog/380397 今天要用Hibernate做点实验,下载最新版得下来.解压,建项目,从tutorial copy代码.Tutorial里面提到说最 ...
- Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析--csdn 曹胜欢...
新接触一个框架的目的就是想利用这个框架来为我们做一些工作,或者是让他来简化我们的工作,利用这个框架无非就是要利用这个框架所给我们提供的API去操作我们的数据,所以利用一个框架的好坏很大一部分取决于你对 ...
- 通向架构师的道路(第七天)之漫谈使用ThreadLocal改进你的层次的划分
一.什么是ThreadLocal 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简 ...
- Hibernate面试题分析
Hibernate面试题分析 1. Hibernate 的检索方式有哪些 ? ① 导航对象图检索 ② OID检索 ③ HQL检索 ④ QBC检索 ⑤ 本地SQL检索 2. 在 Hibernat ...
最新文章
- 产品经理在跨部门沟通中常见问题和解决办法[转自UCDChina]
- 20145207 《Java程序设计》第5周学习总结
- 虚指针的用法(原出处//http://blog.csdn.net/haoel/article/details/1948051)
- Docker swarm - 使用体验 1+2
- 【Linux】一步一步学Linux——uname命令(72)
- mysql磁盘临时表清理_mysql 创建大量磁盘临时表
- Posix线程编程指南(4) 线程终止
- LeetCode(893)——特殊等价字符串组(JavaScript)
- 缺少网卡固件导致的网络服务异常,Can‘t load firmware file bnx2x/bnx2x-e2-7.13.15.0.fw
- Linux设置免密登录
- 云呐-动环监控巡检表,信息机房巡检表
- 我用10张图总结出了这份并发编程最佳学习路线!!(建议收藏)
- 深度解析国内O2O模式
- python实现图片切割和合并
- 温暖的奢侈,当手机遇到机器人
- Mdoi R2 洛谷4月月赛I
- 手把手教你做树莓派魔镜-MagicMirror(七)-接下来
- 数据库字段类型CHAR和INT
- Bluetooth设备之间如何建立连接
- 在Linux系统上运行.net core程序