`
yangyiqian
  • 浏览: 117316 次
  • 来自: ...
社区版块
存档分类
最新评论

转:spring中getSession()连接关闭和实例化被类

阅读更多
http://blog.sina.com.cn/s/blog_4779b7f50100b040.html


spring中getSession()连接关闭和实例化被类
(2008-10-17 14:46:08)
转载
标签:
杂谈


做OA项目中用到了从数据库读下拉框的值。方法的类被SPRING管理就是说不能通过new()得到对象。

开始的做法是

public static DictionarySelect getFromApplicationContext() {
   ApplicationContext ctx  = new ClassPathXmlApplicationContext("/applicationContext.xml");
  dictionarySelect=(DictionarySelect) ctx.getBean("TEDictionarySelect");
  return dictionarySelect;
}

这样每次刷新页面都从配置文件中获取一个对象,多几次后出现JVM 堆溢出。最后把这个方法改成

public static DictionarySelect dictionarySelect=null;//静态工厂模式

public static DictionarySelect getFromApplicationContext() {
  if(dictionarySelect==null)
  {
  ApplicationContext ctx  = new ClassPathXmlApplicationContext("/applicationContext.xml");
  dictionarySelect=(DictionarySelect) ctx.getBean("TEDictionarySelect");
  }
  return dictionarySelect;
}

就好了。看来SPRING管理的类如果从XML获取对象并没有回收,而且读取的速度很慢,时间长了就会使JVM堆

溢出。采用静态工厂模式把对象发在内存里一直使用暂时可以解决此问题。。更好的办法还没想到。。





第2个问题是多运行几次数据库连接就满了程序无法继续执行下去。经测试是使用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
[color=#FF0000]Session session = super.getSession();[/color]
String hql = "from Item as i";
List l = session.createQuery(hql).list();
[color=#FF0000]releaseSession(session);[/color]

}
}

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

相关推荐

    spring 所有功能详解

    - **实例**:Spring对DAO层的支持通常包括连接池管理、SQL查询执行、结果集处理等。 - **DataSource**:Spring支持多种数据源实现,如基于JDBC的数据源。 - **JdbcTemplate**:这是一个高级的JDBC抽象层,简化了...

    java发送邮件 spring发送邮件

    然后,在Spring的配置类中创建`JavaMailSender`的实例,并注入到需要发送邮件的服务中: ```java @Configuration public class EmailConfig { @Value("${spring.mail.host}") private String host; @Value("${...

    Spring获取webapplicationcontext,applicationcontext几种方法详解

    在 Spring 框架中,获取 WebApplicationContext 和 ApplicationContext 对象是非常重要的,因为它们提供了访问 Spring 容器中的 Bean 对象的入口。下面将详细介绍五种获取 WebApplicationContext 和 ...

    Spring+Hibernate整合

    - 在`struts.xml`中声明Action时,不再指定具体的类,而是通过引用Spring中的Bean ID,由Spring负责实例化Action。 此外,为了确保每个请求都能得到一个新的Action实例,需要在Spring的配置文件中将Action的scope...

    JSP开发中在spring mvc项目中实现登录账号单浏览器登录.docx

    确保在项目的类路径下能找到`LoginListenner`类,这样服务器启动时就会加载并实例化这个监听器。 在登录过程中,我们需要在验证用户身份成功后,将登录成功的用户对象(通常是User对象)放入session,并将其命名为...

    Struts2+Spring+Hibernate知识点总结

    综上所述,Struts2、Spring和Hibernate是Java Web开发中常用的三大框架,它们各自解决了不同层面的问题。Struts2负责处理Web请求,Spring则关注于业务逻辑的组织和管理,而Hibernate专注于对象和数据库之间的映射。...

    Flex+J2EE实例(cairngorm+blazeDS+hibernate+spring) part3.pdf

    本章节主要介绍了如何在已有的Flex+J2EE架构项目中集成Spring框架和Hibernate持久层框架。通过这种方式,我们可以更好地实现业务逻辑层和服务端的数据持久化操作。 #### 添加Spring和Hibernate 为了实现Spring和...

    HibernateTemplate及generator用法.docx

    为了简化Hibernate与Spring的集成,Spring提供了HibernateTemplate类,它是Spring对Hibernate的一种封装,使得在DAO层操作数据库变得更加简便和安全。 首先,我们来看如何在DAO中使用HibernateTemplate。通常,DAO...

    struts2.0+spring+hibernate开发示例

    本文将通过一个实例,详细介绍如何在项目中集成SSH,实现数据持久化、业务逻辑管理和用户交互。 首先,让我们从Struts2.0开始。Struts2.0是一款强大的MVC框架,它提供了一种灵活且可扩展的方式来处理HTTP请求和响应...

    学习ssh框架日记

    3. **配置方式**:在Spring应用中,通常有一个或多个配置文件,如`beans.xml`,定义Bean的实例化和依赖关系。 4. **AOP(面向切面编程)**:Spring支持AOP,用于实现如日志、事务管理等功能,让开发者可以专注于...

    ssh开源框架日志心得.pdf

    `HibernateDaoSupport`是Spring提供的抽象类,用于简化Hibernate的使用,它持有一个`HibernateTemplate`实例,该实例封装了Session的创建和管理。 7. **HibernateTemplate与Session**: `HibernateTemplate`是...

    springmybatis

    sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名非常重要,你在 具体的类的映射中,比如User...

    44-Spring Boot使用Redis管理Session1

    然后,在Spring Boot的配置类上添加`@EnableRedisHttpSession`注解,该注解会开启Redis Session管理。在这里,你可以配置`maxInactiveIntervalInSeconds`属性,它定义了Session的默认超时时间,单位为秒。 ```java ...

    Spring boot的上传图片功能实例详解

    在这篇文章中,我们将主要介绍 Spring Boot 上传图片的功能实例详解。 Spring Boot 介绍 Spring Boot 是一个全新的框架,由 Pivotal 团队提供。其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该...

    springmvc 实现i18n国际化+freemarker小实例demo

    在IT行业中,国际化(i18n)是一种技术,它允许软件产品和服务适应不同地区和语言的需求。Spring MVC作为Java Web开发中的一个强大框架,提供了支持i18n的机制。结合Freemarker模板引擎,我们可以构建出具有多语言功能...

    深入学习 Java Servlet开发与实例

    - `init()`:初始化Servlet,仅在Servlet实例化时调用一次。 - `service()`:处理客户端请求,根据请求类型调用`doGet()`或`doPost()`等方法。 - `destroy()`:在Servlet不再使用时调用,用于释放资源。 3. **...

    DAO层中对Hiberante

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者将数据库操作转化为对Java对象的操作。DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问...

    SSH2 java连接远程服务器框架

    在Java中,实现SSH2连接远程服务器的功能通常需要借助第三方库,如JSch或Apache MINA。本教程将详细介绍如何使用Java通过SSH2框架连接到远程服务器。 一、JSch库的使用 JSch是一个纯Java实现的SSH2库,它允许开发者...

    java项目经理

    - `static variable`、`class variable`、`instance variable`: 静态变量、类变量和实例变量的区别及其作用域。 - `heap`、`method area`、`stack`: Java内存模型,包括堆、方法区和栈。 - `GC`(垃圾回收): ...

    SSH整合的三种方式

    在Struts的配置中,我们可以完全不使用ActionSupport,而是让Spring来创建和管理Action实例。在`struts-config.xml`中,我们不再指定特定的Action类,而是使用Spring的`BeanNameUrlHandlerMapping`或`...

Global site tag (gtag.js) - Google Analytics