spring+hibernate多线程下session问题

        最近一个项目,用的是spring MVC和hibernate3.1的数据采集任务功能, 总是执行几次后页面停留在数据刷新状态, 查询无法进行, 深入了解后, 原来是程序中DAO层的save和update方法出了问题,

         @Transactional
           public void save(E entity) {
                     //this.getSession().save(entity);  项目中原来的写法.
                     this.getHibernateTemplate().save(entity);
           }

 

原来的写法 this.getSession();   在多线程的情况下, session没有进行自动释放, 连续的多个getSession()操作,spring无法自动关闭这些session,  即使对save进行try catch也不会有任务错误提示.

this.getHibernateTemplate().save 实际使用的应该是this.getHibernateTemplate().getSessionFactory().getCurrentSession().save()方法

this.getHibernateTemplate().getSessionFactory().getCurrentSession()

从spring管理的sessionFactory中创建一个绑定线程的session。Spring会根据该线程的执行情况来自动判断是关闭session还是延迟关闭。不用手动管理实务,一个线程开启和关闭一次session且性能应该是最好的。

若使用 HibernateDaoSupport 提供的 getSession()方法,正常情况下是不用手动管理的, 不过多线程下, 需要在session操作完毕后执行一下 releaseSession(session) 方法, 程序包含多线程情况下 不推荐使用这种方式.

  如果需要获取session, 建议使用 this.getHibernateTemplate().getSessionFactory().getCurrentSession(); SessionFactory是线程安全的.


  补充:在多线程执行的情况下 

   使用: this.getHibernateTemplate().getSessionFactory().getCurrentSession() 获取session时报错,
   org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

  需要使用   HibernateDaoSupport 提供的 getSession()方法, 并手动在方法结尾 releaseSession(session) 一下.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

it夜猫who

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值