Hibernate中使用ThreadLocal的疑问
以下是使用myEcplipse生成Hibernate的SessionFactory代码中的getSession的部分:
public static Session getSession() throws HibernateException{
Session session = threadLocal.get();
if(session==null || !session.isOpen()){
if(sessionFactory==null){
reBuildSessionFactory();
}
session = (sessionFactory==null ? null : sessionFactory.openSession());
threadLocal.set(session);
}
return session;
}
关于上述代码, 我有如下两个疑问, 希望大家帮忙指点迷津, 再此不胜感激!!!
(1). 假设对于一次特定的请求, 服务端需要多次访问数据库(即:需要调用Dao中不同的方法, 这些方法不能进行合并,Dao中的每个方法都是通过上述代码获取session), 那么在一个线程执行过程中, 在最后一次访问数据库之前, 都不应该关闭session, 否则ThreadLocal中得到将是一个已经close掉的session, 那么就需要重新创建session, 如果这样做, 使用ThreadLocal为了避免频繁的创建销毁session的作用就不大了! 应该怎样做呢?
(2). 在网上看到很多帖子, 说在这里使用ThreadLocal除了有避免频繁创建和销毁session的好处外, 还有一个特别大的好处,
就是可以做到多线程的数据隔离, 可以避免多个线程同时操作同一个session, 我十分的不理解, 这里就算不使用ThreadLocal
有怎么会出现多个线程操作同一个session的情况呢, 来一个线程就创建一个session会有冲突吗?