论坛首页 Java企业应用论坛

Spring+Hibernate中session如何断开

浏览 9781 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-06-27  
仅用Hibernate时,session是手动断开的,但在Spring+Hibernate中都是用如getHibernateTemplate().load()、getHibernateTemplate().save()等操作,根本就没有去考虑断开session,session是怎么断开的呢?并且在我的web服务器上还出现了“unclosed connection,forgot to call close() on your session?”这是怎么一回事啊?
   发表时间:2005-06-27  
我的理解(没有试)
session的断开应该跟事务相关,请尝试用事务模板进行相关操作,
或者通过beanfactory获取已经启用事务的bean来进行相关操作,
0 请登录后投票
   发表时间:2005-06-27  
如果用了spring+hibernate,怎么没有用到spring的事务控制呢?如果没有用到事务控制的话,通过getHibernateTemplate()...再找到Connection
0 请登录后投票
   发表时间:2005-06-28  
是啊.我也有些疑问.session是如何断开的呢?
0 请登录后投票
   发表时间:2005-06-28  
session的断开是在org.springframework.orm.hibernate.SessionFactoryUtils中处理的。
如果应用程序使用了OpenSessionInViewFilter或者OpenSessionInViewInterceptor,那么所有的打开过的session会注册在ThreadLocal里。在当前线程退出前,OpenSessionInViewFilter或者OpenSessionInViewInterceptor将会负责断开这些session。
如果应用程序没有应用OpenSessionInViewFilter或者OpenSessionInViewInterceptor,那么只要该session没有Transaction就直接关闭。否则在transaction结束后关闭。
0 请登录后投票
   发表时间:2005-06-29  
我的服务器出现了“unclosed connection,forgot to call close() on your session?”我该怎么办呢?
0 请登录后投票
   发表时间:2005-07-01  
我想是不是因为你没有对这些操作进行事务管理?getHibernateTemplate()成功之后session是自动断开的,加上OpenSessionInView也是一样,只不过就是一次请求之后断开,是不是你没有配置事务呢?
0 请登录后投票
   发表时间:2005-07-04  
同意楼上的说法, 可以参考 spring中hibernateTempleate.java 源代码中的
execute() 方法   如小:
public Object execute(HibernateCallback action, boolean exposeNativeSession) throws DataAccessException {
Session session = getSession();
boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
if (!existingTransaction && getFlushMode() == FLUSH_NEVER) {
session.setFlushMode(FlushMode.NEVER);
}
try {
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));
Object result = action.doInHibernate(sessionToExpose);
flushIfNecessary(session, existingTransaction);
return result;
}
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
}
catch (SQLException ex) {
throw convertJdbcAccessException(ex);
}
catch (RuntimeException ex) {
// callback code threw application exception
throw ex;
}
finally {
SessionFactoryUtils.closeSessionIfNecessary(session, getSessionFactory());
}
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics