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

转: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-session

    使用filter拦截用户的请求,在filter中包装request,在request的包装类requestWrapper中,重写getSession(), 和getSession(boolean create)。自己实现httpSession,在getSession中获取cookie,从cookie中读取...

    springmybatis

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

    request.getSession().doc

    request.getSession().doc

    Spring使用技巧

    --------------=======Spring 使用技巧========------------------- 1.在SSH中的DAO中执行SQL //申请变量 Connection conn = null; PreparementStatement ps = null; ResultSet rs = null; //通过this.getSession()...

    数据库连接工厂 JdbcFactory

    数据库连接工厂数据库连接工厂数据库连接工厂数据库连接工厂

    C#实现简单获取及设置Session类

    本文实例讲述了C#实现简单获取及设置Session类。分享给大家供大家参考。具体分析如下: 这是一个简单的C#获取Session、设置Session类文件,本类主要实现大家最常用的两个功能: 1、GetSession(string name)根据...

    千方百计笔试题大全

    47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型之间的转换: 14 54、字符串操作:如何实现...

    java面试宝典

    47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型之间的转换: 14 54、字符串操作:如何实现...

    java 中 request.getSession(true、false、null)的区别

    主要介绍了java 中 request.getSession(true/false/null)的区别的相关资料,需要的朋友可以参考下

    NHibernate Demo

    2.增加httpmodule自动关闭功能, Application_EndRequest 处理过程中关闭所有打开连接 3.程式中使用只需要打开连接,不需要关闭 4.ISession session = NHibernateHelper.GetSession("HR"); 带参数的需要在Config中...

    超级有影响力霸气的Java面试题大全文档

     声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,...

    Java中设置session超时(失效)的三种方法

    session的作用:request.getSession()可以帮你得到HttpSession类型的对象,通常称之为session对象,session对象的作用域为一次会话,通常浏览器不关闭,保存的值就不会消失,web.xml中有一个session time out的地方,...

    java 面试题 总结

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    一个开源的Java基础工具包

    此工具我不再更新,里面大多数方法我迁移到了hutool工具包中,而其中一些不常用的功能被遗弃,项目暂留做为以后参考。 common-tools 一、数据库工具类 1、com.baijob.commonTools.db.ds C3p0Ds 和 DruidDs分别是...

    cookie中用字符串方式存储session信息实现的购物车模块

    购物车案例: 基本设计思想: (1)使用session机制,保存用户... (1)创建Session: request.getSession(); (2)创建Cart,并且将Cart放到session (3)调用Cart的方法,完成请求;也会调用 ComputerDAO完成数据库操作

    Mina框架实战(由浅入深,稳扎稳打)

    一个进程中包括Server和Client,进程A和B通信,Server负责接收另一个进程的消息,Client负责发送给另一个进程消息,无需Server独立启动,或者绑定在一个进程中,保证最后离线,或者绑定在一个进程中,进程离线后...

    Struts2实战总结

    3:在action类中取得request和session对象的方法 Map session = ActionContext.getContext().getSession(); HttpServletRequest request = ServletActionContext.getRequest (); 设置它们的值的方法

    java-servlet-api.doc

    当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检杳什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。 绪言 这是一份关于2.1版...

    struts2验证码完整实例

    (参照别人的代码) 部署: 1、将整个源码引入到MyEclipse当中. ...实现流程 : 1、页面加载后,想后台发出生产验证码...2、当你登录时候,提交的输入框中的验证码和session中存放的验证码比较,如果一样,则通过,不一样,则失败

    JAVA程序员面试题

    这既包括 servlet 又包括被编译成 servlet 的 JSP 页面 request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系) ...

Global site tag (gtag.js) - Google Analytics