hibernate关闭懒加载Tamplate需要关闭吗

db:: 3.26::Web Socket Policy Problem fs
Widget settings form goes here循环修改hibernateTemplate查询出来的list
[问题点数:40分]
本版专家分:0
CSDN今日推荐
本版专家分:6179
本版专家分:2200
本版专家分:316
本版专家分:0
本版专家分:6179
本版专家分:6179
本版专家分:0
本版专家分:6179
本版专家分:0
匿名用户不能发表回复!|
CSDN今日推荐从点滴做起,就要不断积累
2011年08月
确定要删除当前文章?spring的事务隔离级别的问题?牛人速度
[问题点数:100分,结帖人huixx]
本版专家分:51
CSDN今日推荐
本版专家分:51
本版专家分:166
本版专家分:222
本版专家分:2371
本版专家分:51
本版专家分:1009
本版专家分:676
本版专家分:302
本版专家分:593
本版专家分:51
本版专家分:51
本版专家分:51
匿名用户不能发表回复!|
CSDN今日推荐这家伙很懒,什么都没留下....
使用hibernate数据库连接不释放的问题
最近同事遇到使用hibernate连接不释放的问题,代码大概是下面这样:
Query query = session.createQuery(hql);
for (int i = 0; i & values. i++) {
query.setParameter(i, values[i]);
List result = query.setFirstResult(offset).setMaxResults(pageSize).list();
看了代码就知道原因了,明显没有关闭连接,所以才会出现连接不释放的问题,应当手动调用session.close()
如果不想每次都要手动关闭连接,最好就不要使用上面的这种用法。简单点的化可以借助于HibernateDaoSupport来完成数据方法的执行,方法是你可以写个DAO类继承HibernateDaoSupport类就可以了。
为什么这样就不会有连接不释放的问题?
看看HibernateDaoSupport源码,你会发现其方法基本上都是类似下面的结构:
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query query = session.getNamedQuery(queryName);
............
});可以看到实际上HibernateDaoSupport中的方法最终都是调用HibernateTemplate类的execute方法,而execute方法最终都会调用doExecute方法,下面是doExecute方法的源码,主要看看finally代码块部分,就是在这里关闭的连接:
protected &T& T doExecute(HibernateCallback&T& action, boolean enforceNewSession, boolean enforceNativeSession)
throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Session session = (enforceNewSession ?
SessionFactoryUtils.getNewSession(getSessionFactory(), getEntityInterceptor()) : getSession());
boolean existingTransaction = (!enforceNewSession &&
(!isAllowCreate() || SessionFactoryUtils.isSessionTransactional(session, getSessionFactory())));
if (existingTransaction) {
logger.debug("Found thread-bound Session for HibernateTemplate");
FlushMode previousFlushMode =
previousFlushMode = applyFlushMode(session, existingTransaction);
enableFilters(session);
Session sessionToExpose =
(enforceNativeSession || isExposeNativeSession() ? session : createSessionProxy(session));
T result = action.doInHibernate(sessionToExpose);
flushIfNecessary(session, existingTransaction);
catch (HibernateException ex) {
throw convertHibernateAccessException(ex);
catch (SQLException ex) {
throw convertJdbcAccessException(ex);
catch (RuntimeException ex) {
// Callback code threw application exception...
finally {//在finally中关闭了session
if (existingTransaction) {
logger.debug("Not closing pre-bound Hibernate Session after HibernateTemplate");
disableFilters(session);
if (previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
// Never use deferred close for an explicitly new Session.
if (isAlwaysUseNewSession()) {
SessionFactoryUtils.closeSession(session);
SessionFactoryUtils.closeSessionOrRegisterDeferredClose(session, getSessionFactory());
综上,如果你是手动创建Query,那你要用完后必须要将session手动关闭。如果你是直接使用HibernateDaoSupport中的方法,那么不需要手动关闭session。或者你调用HibernateTemplate的方法也没有问题,类似getHibernateTemplate().execute(new HibernateCallback() {......})这样。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 hibernate 连接关闭 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信