??xml version="1.0" encoding="utf-8" standalone="yes"?>91麻豆精品国产91久久久更新资源速度超快 ,国产乱码精品1区2区3区,日韩一级大片http://www.aygfsteel.com/redcoatjk/category/49461.html万物皆对?万事归节?/description>zh-cnWed, 02 Nov 2011 17:29:33 GMTWed, 02 Nov 2011 17:29:33 GMT60Hibernate session 获取方式谈http://www.aygfsteel.com/redcoatjk/archive/2011/11/02/362491.htmlredcoatjkredcoatjkTue, 01 Nov 2011 17:37:00 GMThttp://www.aygfsteel.com/redcoatjk/archive/2011/11/02/362491.htmlhttp://www.aygfsteel.com/redcoatjk/comments/362491.htmlhttp://www.aygfsteel.com/redcoatjk/archive/2011/11/02/362491.html#Feedback0http://www.aygfsteel.com/redcoatjk/comments/commentRss/362491.htmlhttp://www.aygfsteel.com/redcoatjk/services/trackbacks/362491.html仅ؓ(f)个h理解.h?/strong>
Hibernate Session, 其作用无需多言.
?/span>q用中ؓ(f)避免资源消?一般都?x)手动封装一个HibernateUtilc?未用Spring理的前提下).
该类的作用Hibernate加蝲配置文gconfig, 创徏sessionFactory{只q行一?
?/span>际运用中,l常需要将当前U程和sessionl定.一般的用法Z用ThreadLocal: 在HibernateUtilcM装hibernate的管?通过openSession取得
session,q将其放入ThreadLocal变量? q样业务逻辑中仅需通过工具cd得当前线E对应的session.使用完毕?调用工具ccloseSessionҎ(gu)?br />session关闭,当前U程的ThreadLocal变量|ؓ(f)NULL. 保证U程归还U程池复用后,ThreadLocal为空,以免出现D其他U程讉K到本U程变量.
?/span>?Hibernate的SessionFactory提供获取session的新Ҏ(gu)getCurrentSession (获得与当前线E绑定的session). 内部通过代理装,此方式得到的session
不仅和当前线E绑?也无需手动开? 默认在事务提交之?session自动关闭. 需注意的是,必须在事务开启的前提之下才可使用此种方式获得的session.
此外hibernate.cfg.xml配置文g中也?dng)R|?div><property name="current_session_context_class">thread</property> ZU程
?/span>?引入Spring之后.sessionfactory的创建等都交lspring理.Spring也提供了HibernateTemplate,HibernateDaoSupportq样的封装方?
用户可以不再考虑session的管?事务的开启关?只需配置事务卛_.
而所谓session关闭?因gq加载导致前台无法显C的问题以往解决方式为强制全部加?现在也可通过在web.xml中配|?div>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter来解?


------------------------------以下内容为工地资?------------------------------------------------------------------------------
OpenSession : 手动打开,需手动关闭.[所以代码中充斥着try catch --sf.openSession --打开事务,提交-回滚 finall关闭session的代码]
threadlocal : hibernatel出的提C? 在HibernateUtil工具cM,new出threadlocal ,攑օopensession.q样可以使当前线E绑定session.
使用后需关闭session,threadlocal中session变量|ؓ(f)null .
3  getCurrentSession: hibernate3的新Ҏ(gu)? 无需手动关闭session,自动获取当前U程的session,若无则新Z. 需在配|文件中配置thread属?表明和当前线E绑?
    参考网友资?getCurrentSession模式,内部开启了session自动提交的功能且使用getCurrentSession的session,?qing)时做load操作,也需要打开事务.
Title

1 getCurrentSession创徏的session?x)和l定到当前线E?而openSession不会(x)?/p>

2 getCurrentSession创徏的线E会(x)在事务回滚或事物提交后自动关?而openSession必须手动关闭

q里getCurrentSession本地事务(本地事务:jdbc)?要在配置文g里进行如下设|?/p>

 * 如果使用的是本地事务Qjdbc事务Q?br />  <property name="hibernate.current_session_context_class">thread</property>
 * 如果使用的是全局事务Qjta事务Q?br />  <property name="hibernate.current_session_context_class">jta</property>

getCurrentSession () 使用当前的session
openSession()         重新建立一个新的session

在一个应用程序中Q如果DAO 层用Spring 的hibernate 模板Q通过Spring 来控制session 的生命周期,则首选getCurrentSession ()?/p>

使用Hibernate的大多数应用E序需要某UŞ式的“上下文相关的” sessionQ特定的session在整个特定的上下文范围内始终有效。然而,对不同类型的应用E序而言Q要Z么是l成q种“上下?#8221;下一个定义通常 是困隄Q不同的上下文对“当前”q个概念定义了不同的范围?span style="color: #ff0000;">?.0版本 之前Q用Hibernate的程序要么采用自行编写的Z ThreadLocal的上下文sessionQ要么采用HibernateUtilq样的辅助类Q要么采用第三方框架Q比如Spring或Pico)Q?它们提供了基于代?proxy)或者基于拦截器(interception)的上下文相关session?/span>?.0.1版本开始,Hibernate增加了SessionFactory.getCurrentSession()Ҏ(gu)?/span>一 开始,它假定了采用JTA事务QJTA事务定义了当前session的范围和上下?scope and context)。Hibernate开发团队坚信,因ؓ(f)有好几个独立的JTA TransactionManager实现E_可用Q不论是否被部vC个J2EE容器中,大多?假若不是所有的Q应用程序都应该采用JTA事务理?Zq一点,采用JTA的上下文相关session可以满你一切需要?/p>

更好的是Q从3.1开始,SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,我们引入了新的扩?接口 (org.hibernate.context.CurrentSessionContext)和新的配|参?(hibernate.current_session_context_class)Q以便对什么是“当前session”的范围和上下?scope and context)的定义进行拔插?/p>

请参?org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契U的详细讨论。它定义 了单一的方法,currentSession()Q特定的实现用它来负责跟t当前的上下文session。Hibernate内置了此接口的两U实现?/p>

org.hibernate.context.JTASessionContext - 当前sessionҎ(gu)JTA来跟t和界定。这和以前的仅支持JTA的方法是完全一L(fng)。详情请参阅Javadoc?/p>

org.hibernate.context.ThreadLocalSessionContext - 当前session通过当前执行的线E来跟踪和界定。详情也请参阅Javadoc?/p>

q两U实现都提供?#8220;每数据库事务对应一个session”的编E模型,也称作每ơ请求一个session。Hibernate session的v始和l结由数据库事务的生存来控制。假若你采用自行~写代码来管理事务(比如Q在Ua(b)的J2SE,或?JTA/UserTransaction/BMTQ,你用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行,事务边界是声明式定义的,你不需要在代码中进行Q何事务或 session理操作。请参阅W?11 ?事务和ƈ发一节来阅读更多的内容和CZ代码?/p>

hibernate.current_session_context_class 配置参数定义了应该采用哪个org.hibernate.context.CurrentSessionContext实现。注意,Z向下兼容Q如果未 配置此参敎ͼ但是存在org.hibernate.transaction.TransactionManagerLookup的配 |,Hibernate?x)采用org.hibernate.context.JTASessionContext。一般而言Q此参数的值指明了要用的?现类的全名,但那两个内置的实现可以用简写,?jta"?thread"?/p>

1、getCurrentSession()与openSession()的区别?

* 采用getCurrentSession()创徏的session?x)绑定到当前U程中,而采用openSession()
创徏的session则不?br /> * 采用getCurrentSession()创徏的session在commit或rollback时会(x)自动关闭Q而采用openSession()
创徏的session必须手动关闭
2、用getCurrentSession()需要在hibernate.cfg.xml文g中加入如下配|:(x)
* 如果使用的是本地事务Qjdbc事务Q?br /> <property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务Qjta事务Q?br /> <property name="hibernate.current_session_context_class">jta</property>

利于ThreadLocal模式理Session
   早在Java1.2推出之时QJavaq_中就引入了一个新的支持:(x)java.lang.ThreadLocalQ给我们在编写多U程E序
   时提供了一U新的选择。ThreadLocal是什么呢Q其实ThreadLocalq是一个线E的本地实现版本Q它q不是一个ThreadQ?br />    而是thread local variable(U程局部变?。也许把它命名ؓ(f)ThreadLocalVar更加合适。线E局部变?ThreadLocal)
   其实的功用非常简单,是为每一个用某变量的线E都提供一个该变量值的副本Q是每一个线E都可以独立地改变自q副本Q?br />    而不?x)和其它U程的副本冲H。从U程的角度看Q就好像每一个线E都完全拥有一个该变量?br />    ThreadLocal是如何做Cؓ(f)每一个线E维护变量的副本的呢Q其实实现的思\很简单,在ThreadLocalcM有一个MapQ?br />    用于存储每一个线E的变量的副本。比如下面的CZ实现(Z单,没有考虑集合的泛?Q?br /> public class HibernateUtil {

public static final ThreadLocal session =new ThreadLocal();

public static final SessionFactory sessionFactory;
   static {
      try {
        sessionFactory = new Configuration().configure().buildSessionFactory();
      } catch (Throwable ex) {
           throw new ExceptionInInitializerError(ex);
      }   
}

     public static Session currentSession() throws HibernateException {
        Session s = session.get();
        if(s == null) {
          s = sessionFactory.openSession();
          session.set(s);
           }
         return s;
       }

    public static void closeSession() throws HibernateException {
           Session s = session.get();
        if(s != null) {
            s.close();
        }
        session.set(null);
    }
}

以下为ThreadLocal的参考资?br />
Title

 最q由于需要用到ThreadLocalQ在|上搜烦(ch)了一些相兌料,发现对ThreadLocall常?x)有下面几?strong>误解

 一、ThreadLocal是javaU程的一个实?br />      ThreadLocal的确是和javaU程有关Q不q它q不是javaU程的一个实玎ͼ它只是用来维护本地变量。针Ҏ(gu)个线E,提供自己的变量版本,主要是ؓ(f)了避免线E冲H,每个U程l护自己的版本。彼此独立,修改不会(x)影响到对斏V?/p>

 二、ThreadLocal是相对于每个session?/p>

        ThreadLocal֐思义Q是针对U程。在java web~程上,每个用户从开始到?x)话l束Q都有自q一个session标识。但是ThreadLocalq不是在?x)话层上。其 实,Threadlocal是独立于用户session的。它是一U服务器端行为,当服务器每生成一个新的线E时Q就?x)维护自q ThreadLocal。对于这个误解,个h认ؓ(f)应该是开发h员在本地Z一些应用服务器试的结果。众所周知Q一般的应用服务器都?x)维护一套线E池Q也 是_(d)对于每次讉KQƈ不一定就新生成一个线E。而是自己有一个线E缓存池。对于访问,先从~存池里面找到已有的U程Q如果已l用光,才去新生成新的线 E。所以,׃开发h员自己在试Ӟ一般只有他自己在测Q这h务器的负担很,q样D每次讉K可能是共用同样一个线E,D?x)有q样的误解:(x)每个 session有一个ThreadLocal

 三、ThreadLocal是相对于每个U程的,用户每次讉K?x)有新的ThreadLocal

  理论上来_(d)ThreadLocal是的是相对于每个线E,每个U程?x)有自己的ThreadLocal。但是上面已l讲刎ͼ一般的应用?务器都会(x)l护一套线E池。因此,不同用户讉KQ可能会(x)接受到同L(fng)U程。因此,在做ZTheadLocalӞ需要}慎,避免出现 ThreadLocal变量的缓存,D其他U程讉K到本U程变量 .[senngr:HibernateUtil工具cM,一般都是通过closesession的方?里面opensession对应的session关闭.q将ThreadLocal变量|ؓ(f)NULL.q样U程池中如果再将q个U程分配l别?对应的ThreadLocal是干净?]

 四、对每个用户讉KQThreadLocal可以多用
        可以_(d)ThreadLocal是一把双刃剑Q用得来的话可以起到非常好的效果。但是,ThreadLocal如果用得不好Q就?x)跟全局变量一栗代码不 能重用,不能独立试。因为,一些本来可以重用的c,现在依赖于ThreadLocal变量。如果在其他没有ThreadLocal场合Q这些类变得不 可用了。个得ThreadLocal用得很好的几个应用场合,值得参?/p>

  1、存攑ֽ前session用户Qquake want的jert

  2、存放一些context变量Q比如webwork的ActionContext

  3、存放sessionQ比如Spring hibernate orm的session



redcoatjk 2011-11-02 01:37 发表评论
]]>
վ֩ģ壺 | ¡| ¹| ɽ| | | ĵ| | | ɽ| կ| | ¡| | | | ̰| | | | | | ±| | ϲ| | | | | ذ| Զ| | | | Ϫ| | | | Ƹ| | |