iteye_6152 2010-01-16 00:16
浏览 374
已采纳

ssh中多线程session共享?

本人在做项目时,要在项目中奥开一个计时器就是另起一个线程,扫描时报了空指针,原来是另起的线程调用不到开始的那个本地的session,就空指针了,怎么样让session共享到多个线程中去?

  • 写回答

3条回答 默认 最新

  • hongmiao88 2010-01-16 08:21
    关注

    在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Session的频繁创建和销毁,对于提高系统的性能来说是非常重要的,以往是通过eclipse的插件来自动完成这些代码的,当然效果是不错的,但是总是觉得不爽(没有读懂那些冗长的代码),所以现在打算自己实现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,用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):

    1. public class ThreadLocal {
    2.   private Map values = Collections.synchronizedMap(new HashMap());
    3.   public Object get() {
    4.    Thread currentThread = Thread.currentThread();
    5.     Object result = values.get(currentThread);
    6.    if(result == null&&!values.containsKey(currentThread)) {
    7.     result = initialValue();
    8.     values.put(currentThread, result);
    9.    }

      1.    return result;
      2.   }
      3.   public void set(Object newValue) {
      4.    values.put(Thread.currentThread(), newValue);
      5.   }
      6.   public Object initialValue() {
      7.    return null;
      8.   }
      9. }

        那麽具体如何利用ThreadLocal来管理Session呢?Hibernate官方文档手册的示例之中,提供了一个通过ThreadLocal维护Session的好榜样:

    10. public class HibernateUtil {

    11.    public static final SessionFactory sessionFactory;   
      
    12.    static {   
      
    13.        try {   
      
    14.              sessionFactory = new Configuration().configure()   
      
    15.                                .buildSessionFactory();   
      
    16.        } catch (Throwable ex) {   
      
    17.             throw new ExceptionInInitializerError(ex);   
      
    18.        }   
      
      1. }
      2. public static final ThreadLocal session =
      3. new ThreadLocal();
      4. public static Session currentSession() throws HibernateException {
      5. Session s = session.get();
      6. if(s == null) {
      7. s = sessionFactory.openSession();
      8. session.set(s);
      9. }
      10. return s;
      11. }
      12. public static void closeSession() throws HibernateException {
      13. Session s = session.get();
      14. if(s != null) {
      15. s.close();
      16. }
      17. session.set(null);
      18. }
      19. }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)