使用ThreadLocal模式管理Hibernate的Session
来源:互联网 发布:汽车零部件企业大数据 编辑:程序博客网 时间:2024/04/29 19:29
在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Session的频繁创建和销毁,对于提高系统的性能来说是非常重要的。我们知道Session是由 SessionFactory负责创建的,而SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一个 SessionFactory并从中获取Session实例,那么Session是否是线程安全的呢?很遗憾,答案是否定的。Session中包含了数据库操作相关的状态信息,那么说如果多个线程同时使用一个Session实例进行CRUD,就很有可能导致数据存取的混乱,你能够想像那些你根本不能预测执行顺序的线程对你的一条记录进行操作的情形吗? 在Session的众多管理方案中,我们今天来认识一种名ThreadLocal模式的解决方案。早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。 ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):
实例程序:
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class MySessionFactory {
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static final Configuration cfg = new Configuration();
private static SessionFactory factory = null;
public static Session currentSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null) {
if (factory == null) {
try {
cfg.configure();
factory = cfg.buildSessionFactory();
} catch (Exception ex) {
ex.printStackTrace();
}
}
session = factory.openSession();
threadLocal.set(session);
}
return session;
}
}
- 使用ThreadLocal模式管理Hibernate的Session
- 利于ThreadLocal模式管理hibernate的Session
- 用ThreadLocal模式管理Hibernate的session
- 利于ThreadLocal模式管理hibernate的Session
- Hibernate用ThreadLocal模式 (线程局部变量模式) 管理Session
- 利于ThreadLocal管理Hibernate Session
- 利于ThreadLocal管理Hibernate Session
- 利于ThreadLocal管理Hibernate Session
- 利用ThreadLocal管理Hibernate Session
- 利用ThreadLocal管理Hibernate Session
- 利于ThreadLocal管理Hibernate Session
- Hibernate——ThreadLocal模式下管理的Session会在事务提交后自动关闭
- 利于ThreadLocal模式管理Session
- 利于ThreadLocal模式管理Session
- 利于ThreadLocal模式管理Session
- 利于ThreadLocal模式管理Session
- 利于ThreadLocal模式管理Session
- 利用ThreadLocal模式管理Session
- 大连市新市区的规划范围
- 2010年终总结--技术篇
- SP2-0618: 无法找到会话标识符。启用检查 PLUSTRACE 角色
- 设计测试用例的四条原则
- Compile libx264 with android-ndk-r4b
- 使用ThreadLocal模式管理Hibernate的Session
- How to enlist code
- [技术讨论]多用户(多公司)的数据库设计讨论
- 哈弗大学图书馆馆训(部分)详解
- 第十一章:程序员的追求
- php 批量生成html、txt文件
- 其实你不懂程序员
- UNIX环境高级编程(第2版)
- 解决ntp的错误 no server suitable for synchronization found