`
769034965
  • 浏览: 5090 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
文章分类
社区版块
存档分类
最新评论

spring的getsession方法造成数据库不关闭连接,SPRING SESSION管理机制。

 
阅读更多
多运行几次数据库连接就满了程序无法继续执行下去。经测试是使用SPRING的getSession()方法获得的连接没有关闭连接。在这里讨论一下SPRING SESSION管理机制。

先看代码:

public class ItemDAOImpl extends HibernateDaoSupport implements ItemDAO {



public List queryAll() throws Exception {

// TODO Auto-generated method stub

Session session=super.getSession(true);

String hql="from Item as i";

List l=super.getSession().createQuery(hql).list();

return l;

}

}\

其实上面的代码隐藏了一个问题,数据库连接并没有被关闭,所以一直出现以上的问题。

我的解决方法还是静态模式:

public Session session;
public Session getcurrentSession()
{
if(session==null)
session=this.getSession();
return session;
}

Iterator it =this.getcurrentSession().createQuery(hql).list().iterator();

暂时可以解决此问题。。更好的办法还在网上找到一篇文章和大家共享:

这里提供三个解决方案 方案一:

getHibernateTemplate().find(hql);

虽然没有手动关闭数据库连接,但spring已经帮我们关闭了。

方案二:(经测试,此方案比较有效)

设定HibernateTemplate的AllowCreate为True

在spring API 的HibernateDaoSupport中

protected net.sf.hibernate.Session getSession(boolean allowCreate)

Get a Hibernate Session, either from the current transaction or a new one.

public class ItemDAOImpl extends HibernateDaoSupport implements ItemDAO {



public List queryAll() throws Exception {

// TODO Auto-generated method stub

Session session=super.getSession(true);

String hql="from Item as i";

List l=session.createQuery(hql).list();

try{

return l;

}finally{

session.close();

}

}

}

Spring API:
geSession()是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,
它可以从当前事务或者一个新的事务获得一个hibernate session.
通常使用releaseSession(org.hibernate.Session)方法与getSession()配合。
如果没有绑定线程,releaseSession关闭由这个DAO的SessionFactory创建的Hibernate Session。 
修改后的代码如下:


public class ItemDAOImpl extends HibernateDaoSupport implements ItemDAO {

public List queryAll() throws Exception {

// TODO Auto-generated method stub

Session session = super.getSession();

String hql = "from Item as i";

List l = session.createQuery(hql).list();

releaseSession(session);



}

}

困扰了几天的问题终于解决了,项目搁浅了好几天了,就是对spring对session的管理不清楚。

以上内容转载:http://blog.sina.com.cn/s/blog_4779b7f50100b040.html

关于getSession()下面有更多讨论:

http://www.javaeye.com/topic/24309

http://www.javaeye.com/post/140793

总的讨论热点就是getSession()要不要手动关闭的问题。

观点:

1.使用getSession()返回session有两种情况。
   a.当前线程有存在session,就直接返回。
   b.当前线程中不存在session就重新创建一个。

如果spring配置了事务,那么session就不必关闭,在事务完成之后将被自动关闭。如果没有参与事务那就要调用session.close()关闭。

2.getSession()拿到的Session无论是否参与事务,Spring都不负责关闭,除非使用OpenSessionInView模式。
分享到:
评论

相关推荐

    自己实现的spring-session

    如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...

    Spring+Hibernate下的数据库连接动态切换

    通过上述方法,我们可以实现在Spring+Hibernate环境下数据库连接的动态切换。这种实现方式不仅提高了系统的灵活性,还增强了应用程序的可扩展性。对于需要支持多租户或多数据库环境的应用而言,这是一种非常实用的...

    学习Spring-Session+Redis实现session共享

    Spring-Session正是为此而设计的一个框架,它提供了一种机制来存储用户的会话信息至中央数据存储区,如Redis等,从而实现跨服务共享。 #### 一、Spring-Session简介 Spring-Session是Spring框架提供的一个用于管理...

    38. Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    通过以上步骤,我们就成功地在Spring Boot应用中实现了基于Redis的分布式Session管理。这种方式不仅解决了Session在分布式环境下的共享问题,还利用Redis的高性能特性提高了系统的可扩展性。在实际项目中,还可以...

    SSH笔记-管理Session和批量操作数据库

    - Spring提供了一种强大的依赖注入(DI)机制,使得我们可以轻松地管理Session。它允许我们创建Bean,这些Bean可以作为Session作用域的实例,确保每个用户请求都有自己的Session实例。 - 利用`...

    (品管工具QC七大手法)BSS_QC_数据库连接和事务管理专题.pdf

    例如,在Hibernate中,通过getSession().connection()可以获取连接,但不能直接关闭,因为连接由Session管理,会在事务提交或回滚时自动释放。而在JdbcTemplate中,通过jdbc.getDataSource().getConnection()获取的...

    44-Spring Boot使用Redis管理Session1

    在开发现代分布式Web应用程序时,保持会话(Session)的有效管理是一项挑战,尤其是在使用Spring Boot构建无状态服务时。然而,在某些场景下,如企业级管理系统,Session仍然是必要的。为了应对多服务器间的Session...

    spring MVC No Session found for current thread

    首先,Spring MVC中的session是基于HTTP协议的会话管理机制,它允许我们在多个请求之间保持状态。当我们在Controller方法中尝试获取session时,如果当前请求没有与之关联的session,Spring MVC就会抛出“No Session ...

    ssm+redis 实现session共享

    1. **SessionID管理**:当用户登录后,Spring Session会生成一个全局唯一的SessionID,这个ID需要通过Cookie返回给客户端,之后的请求都携带此ID以便服务器识别。 2. **过期策略**:配置Redis中的Session过期时间,...

    Spring使用技巧

    通过Session对象的`connection()`方法可以获得底层的数据库连接。这种方式使得开发者可以像使用JDBC那样直接编写SQL语句并执行,而不是依赖于Hibernate的HQL或Criteria API。 ##### 1.2 关闭资源 在使用完数据库...

    spring-redis-session 自定义 key 和过期时间

    Spring-Redis-Session 是一个基于 Spring 框架的会话管理模块,它使用 Redis 作为会话存储介质,提供了灵活的会话管理机制。在本文中,我们将详细介绍 Spring-Redis-Session 的自定义 key 和过期时间的实现原理和...

    SpringBoot整合Shiro,实现从数据库加载权限、权限的动态更新、Session共享

    - **配置Shiro Realm**:创建自定义的`Realm`,继承自`AuthorizingRealm`,并重写`doGetAuthenticationInfo`和`doGetAuthorizationInfo`方法,用于从数据库中获取用户信息和权限信息。 - **配置Shiro Filter**:在...

    Spring MVC 中获取session的几种方法(小结)

    Spring MVC 中获取 Session 的几种方法 在 Spring MVC 中,获取 Session 是一个常见的操作,但是获取 Session 的方法却有很多种。下面我们将介绍五种获取 Session 的方法,每种方法都有其特点和使用场景。 第一种...

    spring-session简介及实现原理源码分析

    Spring-Session 是 Spring旗下的一个项目,旨在解决 Session 管理问题。它可以轻松快捷地集成到我们的应用程序中,并提供了多种存储 Session 的方式。下面是 Spring-Session 的简介、实现原理和源码分析。 Spring-...

    demo-spring-boot-spring-session:使用 Spring Session 演示 Spring Boot

    1. 添加依赖:在 `build.gradle` 或 `pom.xml` 文件中,引入 Spring Session 和相应的存储机制依赖。例如,如果选择使用 Redis 作为存储,需要添加如下依赖: ```xml <groupId>org.springframework.boot ...

    spring事务精髓

    Spring使用`HibernateTemplate`来封装Hibernate的Session操作,而Session是Hibernate中处理数据库连接的对象。在`getSession`方法中,Spring会根据配置决定是否创建新的Session,或者复用已有的Session。在事务管理...

    Spring Session实现分布式session的简单示例

    Spring Session 实现分布式 Session 的简单示例 在本篇文章中,我们将介绍如何使用 Spring Session 实现分布式 Session 的简单示例。这篇文章将从头到尾指导您如何使用 Spring Session 实现分布式 Session,具有很...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    HttpSession session = request.getSession(); WebUserPojo webUser = (WebUserPojo) session.getAttribute("webUser"); // 创建日志对象并保存 LogPojo clog = new LogPojo(); clog.setOpuid(webUser.getId()...

    request.getSession().doc

    Request.getSession() 方法详解 Request.getSession() 方法是 HttpServletRequest 对象中的一个方法,用于获取当前 HTTP 请求关联的 HttpSession 对象。如果当前会话不存在,可以通过 create 参数控制是否创建一个...

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    在 Hibernate 中,Lazy 机制可以减少数据库的查询次数,但是也会导致一些问题。解决这个问题的方法有两种:一种是在 web.xml 中使用 Spring 提供的 OpenSessionInViewFilter,另一种是在 application.xml 中配置 ...

Global site tag (gtag.js) - Google Analytics