hibernateTemplate.find()查询完毕后会关闭session吗?

时间:2021-10-16 00:05:37
hibernateTemplate.find()查询完毕后会关闭session吗?
如果不关闭就会缓存大量持久对象,影响性能。
如果关闭spring又是怎么实现声明式事务处理的呢?

6 个解决方案

#1


是否关闭session,看下源码吧

hibernateTemplate.find()的调用过程如下

find--executeWithNativeSession--doExecute,看下源码
	
protected Object doExecute(HibernateCallback action, boolean enforceNewSession, boolean enforceNativeSession)
throws DataAccessException {

......
finally {
if (existingTransaction) {
logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
disableFilters(session);
if (previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
}
}
else {
// Never use deferred close for an explicitly new Session.
if (isAlwaysUseNewSession()) {
SessionFactoryUtils.closeSession(session);
}
else {
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
}
}
}
}


SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
就是在这里关闭的session,可以继续跟踪

#2


哈!Spring真的好耐无用过拉!楼主是不是用到了级联查询啊!其实想Session初始化对象可以用opensessioninview!很方便由Spring控制session的关闭!因为太耐无用,具体自己上Google查下!讲真用Hibernate真得无你想象中那样强大!

#3


该回复于2009-03-22 08:53:00被版主删除

#4


就想1楼所说,进入SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory()); 
后,这个方法就可以关闭session。

#5


1楼分析的很好。

#6


就想1楼所说,进入SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory()); 
后,这个方法就可以关闭session。

#1


是否关闭session,看下源码吧

hibernateTemplate.find()的调用过程如下

find--executeWithNativeSession--doExecute,看下源码
	
protected Object doExecute(HibernateCallback action, boolean enforceNewSession, boolean enforceNativeSession)
throws DataAccessException {

......
finally {
if (existingTransaction) {
logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
disableFilters(session);
if (previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
}
}
else {
// Never use deferred close for an explicitly new Session.
if (isAlwaysUseNewSession()) {
SessionFactoryUtils.closeSession(session);
}
else {
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
}
}
}
}


SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
就是在这里关闭的session,可以继续跟踪

#2


哈!Spring真的好耐无用过拉!楼主是不是用到了级联查询啊!其实想Session初始化对象可以用opensessioninview!很方便由Spring控制session的关闭!因为太耐无用,具体自己上Google查下!讲真用Hibernate真得无你想象中那样强大!

#3


该回复于2009-03-22 08:53:00被版主删除

#4


就想1楼所说,进入SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory()); 
后,这个方法就可以关闭session。

#5


1楼分析的很好。

#6


就想1楼所说,进入SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory()); 
后,这个方法就可以关闭session。