当前位置: 代码迷 >> Java Web开发 >> Hibernate新手疑惑:session关闭有关问题
  详细解决方案

Hibernate新手疑惑:session关闭有关问题

热度:68   发布时间:2016-04-14 20:37:39.0
Hibernate新手疑惑:session关闭问题
代码如下:

public void sava(Employee emp) {
                Session session = null;
Transaction tx = null;
try {
session = HibernaterUtil.getSesssion();
tx = session.beginTransaction();
        session.save(emp);
tx.commit();
} catch (Exception e) {
        if(tx!=null)tx.rollback();
e.printStackTrace();
} finally {
session.close();//疑惑
}
}


public class HibernaterUtil {
private static SessionFactory sf;
static {
sf = new Configuration().configure().buildSessionFactory();
}

public static Session getSesssion() {
return sf.openSession();
}
}


session.close()。突然对这句语句有点疑惑,为什么不要先判断session!=null,而是直接就关闭了?

------解决思路----------------------
应该判断下 ,
try块中的异常. 因为有catch的存在,只能在控制台里看到,
finally块的内容不管try块中是否有错误,都会执行 , 而当session是null的话, 就会报空指针异常
------解决思路----------------------
由于你使用的是openSession,所以最后应该判断session是否为空并调用close方法,否则会出空指针异常。。。
------解决思路----------------------
引用:
由于你使用的是openSession,所以最后应该判断session是否为空并调用close方法,否则会出空指针异常。。。
不管如何,finally最终都会执行的,应该加上空判断,会让程序更健壮一点
------解决思路----------------------
因此你前面已经new了一个session出来,如果session为空的话,try{}代码块里就会报错。如果session不为空,但是后面执行save报错了,这个时候你的异常被捕获到,运行到这个地方停止了,但是session还是打开着,如果你不关闭session又继续执行其他操作的话,系统性能会降低。
所以用你这种写法的话,session要关闭,而又不必在关闭前判断session是否为空
------解决思路----------------------
应该在finally里做一下判断的,为了保证程序的健壮性。

if(s!=null && s.isOpen()){
s.close();
}



public class HibernaterUtil {
    private static SessionFactory sf;
    static {
        sf = new Configuration().configure().buildSessionFactory();
    }
 
    public static Session getSesssion() {
           Session s = null;
if(sf!=null){
s = sf.openSession();
}
return s;
    }
}

------解决思路----------------------
引用:
应该在finally里做一下判断的,为了保证程序的健壮性。


[晕死,一个用户只能连续回复三次,这是小号]
嗯,看到官方文档中没有关闭,然后又没搞懂事务与session的关系。以为关闭了事物,该session就无所谓了,或者其它的设置之类的原因。弄了良久,到现在都没理清头绪。现在都有点怀疑是写这个文档的人有点偷懒,没有进行非空判断了

------解决思路----------------------
楼主没错,是要加判断!
只不过一般session都不会被关闭,所以就没怎么出错。
------解决思路----------------------
引用:
Quote: 引用:

因此你前面已经new了一个session出来,如果session为空的话,try{}代码块里就会报错。如果session不为空,但是后面执行save报错了,这个时候你的异常被捕获到,运行到这个地方停止了,但是session还是打开着,如果你不关闭session又继续执行其他操作的话,系统性能会降低。
所以用你这种写法的话,session要关闭,而又不必在关闭前判断session是否为空


嗯。当session为空的话,try{}代码块里会报错,catch中语句会执行,当finally里的语句执行时,又会抛出空指针异常,那catch就感觉没啥作用了,那为什么不判断下非空呢?。请详细说下这个地方,有点不太明白

我觉得是这样的,如果session为空,即 session = HibernaterUtil.getSesssion(); 有问题,也就是工具类 HibernaterUtil?的 sf.openSession() 有问题,因为你用的是 openSession 而不是 currentSession ,所以 openSession 报错的根本原因应该是 sf 为空,也就是数据库连接有问题,因此我觉得你应该在工具类 HibernaterUtil?的静态块里加上 try{}catch,也就是

static {
        try {
sf = new Configuration().configure().buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
}
    }
  相关解决方案