opensession 和getcurrentsession区别

解决Struts整合Hibernate框架中session关闭问题

今天又碰到一个花了半天时间解决的问题,其实问题解决的很简单。但还是觉得需要记录一下:

问题如下:在搭建好struts整合hibernate框架后,在测试的时候出现问题:测试代码如下:

public class LoginAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	private String name;
	private String see;
	Event myevent=new Event();
	public String execute() throws Exception {
		
		
		HttpServletResponse response=ServletActionContext.getResponse();
		HttpServletRequest request = ServletActionContext.getRequest();
		myevent.setTitle(request.getParameter("na"));
		myevent.setAge(Integer.parseInt(request.getParameter("pass")));
		myevent.setDate(new Date());
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.save(myevent);
        session.getTransaction().commit();
       // session.close();
		//HibernateUtil.getSessionFactory().close();
		return SUCCESS;
	}


页面很简单,就是form表单传值,但是测试的时候,每次都跳转到error.jsp,即返回了error。但是查询数据库,发现又插入了值,可见是数据库操作是执行的了,将session.close();替换为HibernateUtil.getSessionFactory().close();后问题解决,但是这绝对不是正确的解决办法。因为我们不可能每次数据库连接后都要关闭sessionfactoy,最后在网上寻找答案,终于发现了一篇文章,连接如下:http://blog.sina.com.cn/s/blog_6ac4c6cb010182zg.html,讲的是opensession和getcurrentsession的区别
对于上述的两个方法,有以下区别:
 1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
 2. getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。
  里面有句话:
对于getCurrentSession 来说,事务提交会自动close,不需要像openSession一样自己调用close方法关闭session。看到这句话恍然大悟,
原来使用getcurrentsession方法是不需要调用session.close方法的。果然,将session.close();注释掉,一切正常了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值