hiernate 集中管理session

问题:
使用hibernate 一般会使用到hibernate的延迟加载技术,但是我在第一次使用延迟加载的时候,发现报错,不能取出延迟集合中的值。当时只能不使用延迟加载。
原因:
在dao层把数据取出后,已关闭session,而处理延迟的集合是在业务逻辑层,在需要使用延迟的集合的时候,hibernate会去数据库取数据。但是现在session已经关闭,所以不能取出延迟的数据。
解决:
在后来研读hibernate相关书籍的时候,才发现在使用session的集中管理可以解决这一问题。集中管理方式,较多的为ThreadLoad模式,ThreadLoad会把session与当前线程绑定。在当前线程创建时,创建session。在当前线程结束时,关闭session。
在spring和hibernate共同使用的应用中,集中管理一般分为:1、在一次请求中打开一个session,2、在一次事物中打开一个session。
一、 在一次请求中打开一个session:是在一个http请求开始的时候创建一个sessio并绑定到ThreadLoad中,在这个请求返回之前一直保持session打开。从而使这个session在整个请求期间都可以使用。
在web.xml中添加

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInviewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

缺点:如果请求在某一节点被阻塞,在此期间session资源会一直占用而不释放掉,如果冰法较大,会造成系统宕机,如果某一步发生异常也会导致session没有正常关闭.
二、在一个事物中打开一个session:在开始一个事物之前创建session,并把session绑定到当前事物。当事物提交或者回滚时,就会释放当前相关的session,并关闭session。
使用该中session集中管理,需要在代码中实现。

Session session = getSession();
boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session,getSessionFactory());
FlushMode previousFlushMode = null;
try{
...
return result;
}cathch(Exception e){
....
}finally{
if(existingTransaction ){
disableFilters(session);
if(previousFlushMode != null){
session.setFlushMode(previousFlushMode );
}
}else{
SessionFactoryUtils.releaseSession(session,getSessionFactory());
}
}

两种那个更合适,需要自己取舍,在一个事物中打开一个session不会出现宕机,但是在一个请求中,可能会有多个事物,会多次连接数据库。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值