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对DAO层的支持通常包括连接池管理、SQL查询执行、结果集处理等。 - **DataSource**:Spring支持多种数据源实现,如基于JDBC的数据源。 - **JdbcTemplate**:这是一个高级的JDBC抽象层,简化了...
然后,在Spring的配置类中创建`JavaMailSender`的实例,并注入到需要发送邮件的服务中: ```java @Configuration public class EmailConfig { @Value("${spring.mail.host}") private String host; @Value("${...
在 Spring 框架中,获取 WebApplicationContext 和 ApplicationContext 对象是非常重要的,因为它们提供了访问 Spring 容器中的 Bean 对象的入口。下面将详细介绍五种获取 WebApplicationContext 和 ...
- 在`struts.xml`中声明Action时,不再指定具体的类,而是通过引用Spring中的Bean ID,由Spring负责实例化Action。 此外,为了确保每个请求都能得到一个新的Action实例,需要在Spring的配置文件中将Action的scope...
确保在项目的类路径下能找到`LoginListenner`类,这样服务器启动时就会加载并实例化这个监听器。 在登录过程中,我们需要在验证用户身份成功后,将登录成功的用户对象(通常是User对象)放入session,并将其命名为...
综上所述,Struts2、Spring和Hibernate是Java Web开发中常用的三大框架,它们各自解决了不同层面的问题。Struts2负责处理Web请求,Spring则关注于业务逻辑的组织和管理,而Hibernate专注于对象和数据库之间的映射。...
本章节主要介绍了如何在已有的Flex+J2EE架构项目中集成Spring框架和Hibernate持久层框架。通过这种方式,我们可以更好地实现业务逻辑层和服务端的数据持久化操作。 #### 添加Spring和Hibernate 为了实现Spring和...
为了简化Hibernate与Spring的集成,Spring提供了HibernateTemplate类,它是Spring对Hibernate的一种封装,使得在DAO层操作数据库变得更加简便和安全。 首先,我们来看如何在DAO中使用HibernateTemplate。通常,DAO...
本文将通过一个实例,详细介绍如何在项目中集成SSH,实现数据持久化、业务逻辑管理和用户交互。 首先,让我们从Struts2.0开始。Struts2.0是一款强大的MVC框架,它提供了一种灵活且可扩展的方式来处理HTTP请求和响应...
3. **配置方式**:在Spring应用中,通常有一个或多个配置文件,如`beans.xml`,定义Bean的实例化和依赖关系。 4. **AOP(面向切面编程)**:Spring支持AOP,用于实现如日志、事务管理等功能,让开发者可以专注于...
`HibernateDaoSupport`是Spring提供的抽象类,用于简化Hibernate的使用,它持有一个`HibernateTemplate`实例,该实例封装了Session的创建和管理。 7. **HibernateTemplate与Session**: `HibernateTemplate`是...
sessionFactory 用的,里面主要包含了数据库连接相关东西,还有 java 类所对应的别名,比如 <typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/> 这个别名非常重要,你在 具体的类的映射中,比如User...
然后,在Spring Boot的配置类上添加`@EnableRedisHttpSession`注解,该注解会开启Redis Session管理。在这里,你可以配置`maxInactiveIntervalInSeconds`属性,它定义了Session的默认超时时间,单位为秒。 ```java ...
在这篇文章中,我们将主要介绍 Spring Boot 上传图片的功能实例详解。 Spring Boot 介绍 Spring Boot 是一个全新的框架,由 Pivotal 团队提供。其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该...
在IT行业中,国际化(i18n)是一种技术,它允许软件产品和服务适应不同地区和语言的需求。Spring MVC作为Java Web开发中的一个强大框架,提供了支持i18n的机制。结合Freemarker模板引擎,我们可以构建出具有多语言功能...
- `init()`:初始化Servlet,仅在Servlet实例化时调用一次。 - `service()`:处理客户端请求,根据请求类型调用`doGet()`或`doPost()`等方法。 - `destroy()`:在Servlet不再使用时调用,用于释放资源。 3. **...
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它允许开发者将数据库操作转化为对Java对象的操作。DAO(Data Access Object)层是软件设计模式中的一个重要概念,主要用于处理数据访问...
在Java中,实现SSH2连接远程服务器的功能通常需要借助第三方库,如JSch或Apache MINA。本教程将详细介绍如何使用Java通过SSH2框架连接到远程服务器。 一、JSch库的使用 JSch是一个纯Java实现的SSH2库,它允许开发者...
- `static variable`、`class variable`、`instance variable`: 静态变量、类变量和实例变量的区别及其作用域。 - `heap`、`method area`、`stack`: Java内存模型,包括堆、方法区和栈。 - `GC`(垃圾回收): ...
在Struts的配置中,我们可以完全不使用ActionSupport,而是让Spring来创建和管理Action实例。在`struts-config.xml`中,我们不再指定特定的Action类,而是使用Spring的`BeanNameUrlHandlerMapping`或`...