hibernate的session是用完一次就关闭一次吗 比如有好几个查询,是查完一次就session.close(),然后再拿session,查完再close()。还是说一直查完几个查询最后session.close(),哪种方式好啊。我的意思是拿session会不会也有开销。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 理论上是如果你用spring代为管理就不用关闭啦 不用spring的时候,还是不要关闭,容易报错。一个线程一个session,不用的时候等gc回收 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();我想知道哪种好 session要关闭 不然可能多个session出现问题 用localThread的api,,一线程一session,不会冲突 当然是使用一个session去查询的好啊,一个session对应一个数据库连接,频繁获取数据库连接肯定会对数据库造成压力的。使用Spring去管理,它内部也是使用ThreadLocal去管理session的 session是非线程安全的,所以一个请求处理对应一个session。当然若几个请求要在一个事务中进行,则需要共享session,此时可以结合spring的事务进行处理。另外:8楼说一个Session对应一个数据库连接,这话是不对的,应该是一个SessionFactory对应一个数据库连接,且得到一个session也不会有很大的开销,不然hibernate也就不会这样设计了 session是轻量级的,还是用一次关闭比较好 3楼的 那段代码其实 第一种是比较好的 但是要用try catch 包起来 在try外面声名 session 在 catch里面close 就可以了 session是需要关闭的,需要时再去取。 好像不同的意见各占一半啊,到底哪种好啊。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(); 一个session的生命周期就代表了一个事物的生命,如果你想把那一连串的查询操作当做一个事物,你可以只写一个close语句。还有以下情况:当你将你hibernate和Spring结合使用的时候,采用Spring管理事务后,也就让Spring管理你的事务(这里面也是一些配置)那么你就不用担心事务的开启与关闭的问题。因为Spring会自动的开启,提交事务,关闭事务。 如果是在一个方法里用第一种最好能将 session.close()放到 finally里,防止close前发生异常而不能close 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里面控制 session是轻量级的,应该用一次关闭一次。用spring的代理就可以不用,用一次关一次。 应该没有多大分别。PS:如果是用一个session,则它们在一个事物里面,一个操作报异常该session的操作都会回滚。 Session 在Hibernate 中叫做一级缓存!是一个轻量级的!同时也是线程不安全的!所以每一个方法交Session交互过就应该关闭!而不能存在过久!具中在处理的时候会有一个HibernateException 是一个非受检Exception!最好是try{}catch(){}处理一下! 没用spring的话用一次关闭一次,个人感觉这样好很多~~ 用第一个吧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就行了, 首先sessionFactory 是重量级的,一个项目如果只有一个数据库最好只初始化一次最理想的 one-session-request 一个会话一个session 当然不关最好了了,和数据库建一次会话和销毁一次会话需要的效率和时间都是有的可以自己写个栈的数据结构保存session,如果不想写,直接用java.util.Stack类不想管理又想提高效率,那么就像大家所说的,用Spring去管理 如果不关闭的话,会引起tomcat的当机吗? Java 虽然可以自动回收,但是他是不定时的,你也不 知道虚拟机什么 时候回收,所以正规的一点的公司都会要求 程序员关闭Session ,但是现在用了 Spring 后,只要配置一下,就可以了,不用程序员来管里Session 了 如果用的同一个session处理一批操作的话(而且这一批操作都互相有联系的话),那其中的操作有一个失败,所有的全部回滚,用同一个session比较好!个人意见 关闭,就想数据库连接Connection getCurrentSession创建的session在session commit,rollback时会自动关闭 session 在一个方法内 关不关都一样 因为轻量级的 如果俩个方法以上就不能共用一个session 否则一个还没运行 另一个给他关了 session 是非线程安全的,理论是是要用一个关一个 赞成19楼的写法。首先session是非线程安全的,当程序出现异常时,会调用finally块,从而关闭session释放资源; 你的两种代码中的list1和list2是什么意思?如果你的一次查询(业务层次的一次查询)会用到list1和list2的话,那就用第二种。session是hibernate的一级缓存,你可以认为session是以事物为单位的。(这里的list1,list2很可能已经是两个事务了)。如果一次就可以得到这个业务的全部数据(list1就够了,list2是为另一个业务服务的),那就用一次关一次。session非线程安全,公用session不合理。 用opensessioninview 保存一次会话 用一个关一个 因为你调用Session时 并不是又开启一个Session,而是Spring去池里找有没有匹配的Session给你用,不会造成资源浪费 会话关闭了.不过它就是这样的.像getConnection()一样,用完也是要Close()的.应该也是放到池里了.而这个资源的浪费不算什么.每次都查出所有的列不更浪费.然后多数情况用了一次就扔了 jsp如何实现500M以上文件上传的方法,急!急!急! Tomcat小问题 反射报道异常 JAVA中的空指向异常怎么解决? 跪求:hibernate的分页例子或jdbc分页的例子 小弟要崩溃了!!!Servlet下载Excel,中文名总是乱码,哪位大哥大姐能帮我看下 看过JPetStore的进来帮我一个回答一个问题好吗 在STRUTS+SPRING+HIBERNATE组合中,为什么很多人喜欢使用自定义异常? log4j能不能写中文日志? 一个初级的hello,EJB问题! hibernate问题 java中timer里边那个间隔时间可以刷新的吗
如果你用spring代为管理就不用关闭啦
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();我想知道哪种好
当然若几个请求要在一个事务中进行,则需要共享session,此时可以结合spring的事务进行处理。
另外:8楼说一个Session对应一个数据库连接,这话是不对的,应该是一个SessionFactory对应一个数据库连接,且得到一个session也不会有很大的开销,不然hibernate也就不会这样设计了
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();
还有以下情况:当你将你hibernate和Spring结合使用的时候,采用Spring管理事务后,也就让Spring管理你的事务(这里面也是一些配置)那么你就不用担心事务的开启与关闭的问题。因为Spring会自动的开启,提交事务,关闭事务。
如果是在一个方法里用第一种
最好能将 session.close()放到 finally里,防止close前发生异常而不能close
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里面控制
用spring的代理就可以不用,用一次关一次。
同时也是线程不安全的!所以每一个方法交Session交互过
就应该关闭!而不能存在过久!
具中在处理的时候会有一个HibernateException 是一个
非受检Exception!最好是try{}catch(){}处理一下!
用一次关闭一次,个人感觉这样好很多~~
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,如果不想写,直接用java.util.Stack类
不想管理又想提高效率,那么就像大家所说的,用Spring去管理
个人意见
如果你的一次查询(业务层次的一次查询)会用到list1和list2的话,那就用第二种。
session是hibernate的一级缓存,你可以认为session是以事物为单位的。(这里的list1,list2很可能已经是两个事务了)。如果一次就可以得到这个业务的全部数据(list1就够了,list2是为另一个业务服务的),那就用一次关一次。session非线程安全,公用session不合理。
应该也是放到池里了.而这个资源的浪费不算什么.
每次都查出所有的列不更浪费.然后多数情况用了一次就扔了