比如有好几个查询,是查完一次就session.close(),然后再拿session,查完再close()。
还是说一直查完几个查询最后session.close(),哪种方式好啊。
我的意思是拿session会不会也有开销。

解决方案 »

  1.   

    理论上是
    如果你用spring代为管理就不用关闭啦
      

  2.   

    不用spring的时候,还是不要关闭,容易报错。一个线程一个session,不用的时候等gc回收
      

  3.   

    Session session = null;
    session = HibernateSessionFactory.getSession();
    Query query = session.createSQLQuery(sql1);
    List list1 = query.list();
    query = session.createSQLQuery(sql2);
    List list2 = query.list();
    session.close();
    ----------------------------------------------------
    Session session = null;
    session = HibernateSessionFactory.getSession();
    Query query = session.createSQLQuery(sql1);
    List list1 = query.list();
    session.close();
    session = HibernateSessionFactory.getSession();
    query = session.createSQLQuery(sql2);
    List list2 = query.list();
    session.close();我想知道哪种好
      

  4.   

    session要关闭 不然可能多个session出现问题
      

  5.   

    用localThread的api,,一线程一session,不会冲突
      

  6.   

    当然是使用一个session去查询的好啊,一个session对应一个数据库连接,频繁获取数据库连接肯定会对数据库造成压力的。使用Spring去管理,它内部也是使用ThreadLocal去管理session的
      

  7.   

    session是非线程安全的,所以一个请求处理对应一个session。
    当然若几个请求要在一个事务中进行,则需要共享session,此时可以结合spring的事务进行处理。
    另外:8楼说一个Session对应一个数据库连接,这话是不对的,应该是一个SessionFactory对应一个数据库连接,且得到一个session也不会有很大的开销,不然hibernate也就不会这样设计了
      

  8.   

    session是轻量级的,还是用一次关闭比较好
      

  9.   

    3楼的 那段代码其实 第一种是比较好的 但是要用try catch 包起来 在try外面声名 session 在 catch里面close 就可以了 
      

  10.   

    session是需要关闭的,需要时再去取。
      

  11.   

    好像不同的意见各占一半啊,到底哪种好啊。
    Session session = null;
    session = HibernateSessionFactory.getSession();
    Query query = session.createSQLQuery(sql1);
    List list1 = query.list();
    query = session.createSQLQuery(sql2);
    List list2 = query.list();
    session.close();
    ----------------------------------------------------
    Session session = null;
    session = HibernateSessionFactory.getSession();
    Query query = session.createSQLQuery(sql1);
    List list1 = query.list();
    session.close();
    session = HibernateSessionFactory.getSession();
    query = session.createSQLQuery(sql2);
    List list2 = query.list();
    session.close();
      

  12.   

    一个session的生命周期就代表了一个事物的生命,如果你想把那一连串的查询操作当做一个事物,你可以只写一个close语句。
    还有以下情况:当你将你hibernate和Spring结合使用的时候,采用Spring管理事务后,也就让Spring管理你的事务(这里面也是一些配置)那么你就不用担心事务的开启与关闭的问题。因为Spring会自动的开启,提交事务,关闭事务。
      

  13.   


    如果是在一个方法里用第一种
    最好能将 session.close()放到 finally里,防止close前发生异常而不能close
      

  14.   


    Session session = HibernateSessionFactory.getSession();
    try {
    Query query = session.createSQLQuery(sql1);
    List list1 = query.list();
    query = session.createSQLQuery(sql2);
    List list2 = query.list();
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    session.close();
    }
    用完就关或者在Filter里面控制
      

  15.   

    session是轻量级的,应该用一次关闭一次。
    用spring的代理就可以不用,用一次关一次。
      

  16.   

    应该没有多大分别。PS:如果是用一个session,则它们在一个事物里面,一个操作报异常该session的操作都会回滚。
      

  17.   

    Session 在Hibernate 中叫做一级缓存!是一个轻量级的!
    同时也是线程不安全的!所以每一个方法交Session交互过
    就应该关闭!而不能存在过久!
    具中在处理的时候会有一个HibernateException 是一个
    非受检Exception!最好是try{}catch(){}处理一下!
      

  18.   

    没用spring的话
    用一次关闭一次,个人感觉这样好很多~~
      

  19.   

    用第一个吧
    Session session = null;
    session = HibernateSessionFactory.getSession();
    Query query = session.createSQLQuery(sql1);
    List list1 = query.list();
    query = session.createSQLQuery(sql2);
    List list2 = query.list();
    session.close();
    ----------------------------------------------------
      

  20.   

    你只要保证每个线程都有自己的session就行了,
      

  21.   

    首先sessionFactory 是重量级的,一个项目如果只有一个数据库最好只初始化一次最理想的 one-session-request  一个会话一个session 
      

  22.   

    当然不关最好了了,和数据库建一次会话和销毁一次会话需要的效率和时间都是有的
    可以自己写个栈的数据结构保存session,如果不想写,直接用java.util.Stack类
    不想管理又想提高效率,那么就像大家所说的,用Spring去管理
      

  23.   

    如果不关闭的话,会引起tomcat的当机吗?
      

  24.   

    Java 虽然可以自动回收,但是他是不定时的,你也不  知道虚拟机什么 时候回收,所以正规的一点的公司都会要求 程序员关闭Session ,但是现在用了 Spring  后,只要配置一下,就可以了,不用程序员来管里Session 了
      

  25.   

    如果用的同一个session处理一批操作的话(而且这一批操作都互相有联系的话),那其中的操作有一个失败,所有的全部回滚,用同一个session比较好!
    个人意见
      

  26.   

    关闭,就想数据库连接Connection
      

  27.   

    getCurrentSession创建的session在session commit,rollback时会自动关闭
      

  28.   

    session 在一个方法内 关不关都一样 因为轻量级的   如果俩个方法以上就不能共用一个session 否则一个还没运行  另一个给他关了
      

  29.   

    session 是非线程安全的,理论是是要用一个关一个
      

  30.   

       赞成19楼的写法。首先session是非线程安全的,当程序出现异常时,会调用finally块,从而关闭session释放资源;
      

  31.   

    你的两种代码中的list1和list2是什么意思?
    如果你的一次查询(业务层次的一次查询)会用到list1和list2的话,那就用第二种。
    session是hibernate的一级缓存,你可以认为session是以事物为单位的。(这里的list1,list2很可能已经是两个事务了)。如果一次就可以得到这个业务的全部数据(list1就够了,list2是为另一个业务服务的),那就用一次关一次。session非线程安全,公用session不合理。
      

  32.   

    用opensessioninview 保存一次会话
      

  33.   

    用一个关一个 因为你调用Session时 并不是又开启一个Session,而是Spring去池里找有没有匹配的Session给你用,不会造成资源浪费
      

  34.   

    会话关闭了.不过它就是这样的.像getConnection()一样,用完也是要Close()的.
    应该也是放到池里了.而这个资源的浪费不算什么.
    每次都查出所有的列不更浪费.然后多数情况用了一次就扔了