if (session == null) {
      if (sessionFactory == null) {
        try {
          cfg.configure(CONFIG_FILE_LOCATION);
          sessionFactory = cfg.buildSessionFactory();
        }
        catch (Exception e) {
          System.err.println(
              "%%%% Error Creating SessionFactory %%%%");
          e.printStackTrace();
        }
      }
      session = sessionFactory.openSession();
      threadLocal.set(session);
    }

解决方案 »

  1.   

    呵呵,多谢欢天喜地给我写出例程,不过我也在程序中试了,好像这种那个情况下,session并不是null,该怎么办啊?
      

  2.   

    而且这段代码是在某个函数的一开始就写么,还是在session = sessionFactory.openSession();
    之后,然后再加上这段判断?
      

  3.   

    我觉得,如果sessionFactory已经“失效”,那么在使用
    session = sessionFactory.openSession();
    会报异常,如果在这里对异常进行合理的处理,比如:当出现异常的时候,重新执行:
              cfg.configure(CONFIG_FILE_LOCATION);
              sessionFactory = cfg.buildSessionFactory();可以满足需求,
    不过,在异常中进行逻辑上的控制,终归不是好办法,
    希望有更好的办法。
      

  4.   

    我在试验的时候,在session = sessionFactory.openSession();时并没有报异常,而是在执行实际的数据库操作的时候才会报,比如session.save(),所以无法在使用之前就能截到,所以比较无奈,还请更多的高手多多帮忙
      

  5.   

    在异常中重新加载session工厂呢,或者在web服务器配置重连
      

  6.   

    你应该在连接池中加入判断连接是否有效的设置例如,你可以在Tomcat的设置中加入validationQuery语句(每次从池中获取连接时都会先根据此语句验证是否可用)的设置
      

  7.   

    我没有使用第三方提供的连接池,也没有使用tomcat,只是hibernate默认的连接池,请问这种情况下如何解决,多谢
      

  8.   

    hibernate自带的连接池应该是不支持validationQuery,建议你使用Tomcat的(其实就是Apache的DBCP包),这个也是hibernate所建议的