<b>Hibernate的事件和并发(二)</b>[Java编程]
本文“<b>Hibernate的事件和并发(二)</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
12.2.1.非托管环境
假如Hibernat长期层运行在一个非托管环境中,数据库衔接普通由Hibernate的衔接池机制 来处理.
代码内容
session/transaction处理方法以下所示:
//Non-managed environment idiom
Session sess = factory.openSession();
Transaction tx = null;
try {
tx = sess.beginTransaction();
// do some work
...
tx.commit();
}
catch (RuntimeException e) {
if (tx != null) tx.rollback();
throw e; // or display error message
}
finally {
sess.close();
}
你不需求显式flush() Session - 对commit()的调用会自动触发session的同步.
调用 close() 标志session的完毕. close()办法重要的表示是,session释放了JDBC衔接.
这段Java代码是可移植的,可以在非托管环境和JTA环境中运行.
你极大概从未在一个尺度的利用程序的业务代码中见过这样的用法;致命的(系统)非常应当老是 在利用程序“顶层”被捕捉.换句话说,履行Hibernate调用的代码(在长期层)和处理 RuntimeException非常的代码(普通只能清理和退出利用程序)应当在差别 的利用程序逻辑层.这关于你计划自己的软件系统来说是一个挑衅,只要有大概,你就应当利用 J2EE/EJB容器服务.非常处理将在本章稍后举行谈论.
请注意,你应当挑选 org.hibernate.transaction.JDBCTransactionFactory (这是默许选项).
12.2.2.利用JTA
假如你的长期层运行在一个利用服务器中(比方,在EJB session beans的背面),Hibernate获得 的每个数据源衔接将自动成为全局JTA事件的一部份.Hibernate供应了两种战略举行JTA集成.
假如你利用bean管理事件(BMT),可以通过利用Hibernate的 Transaction API来奉告 利用服务器启动和完毕BMT事件.因此,事件管理代码和在非托管环境下是一样的.
代码内容
在CMT方法下,事件声明是在session bean的布置描写符中,而不需求编程. 除非你设置了属性hibernate.transaction.flush_before_completion和 hibernate.transaction.auto_close_session为true, 不然你必须自己同步和关闭Session.Hibernate可认为你自动同步和关闭 Session.你唯一要做的就是当发生非常时举行事件回滚.幸运的是, 在一个CMT bean中,事件回滚乃至可以由容器自动举行,因为由session bean办法抛出的未处理的 RuntimeException非常可以告诉容器设置全局事件回滚.这意味着 在CMT中,你完好无需利用Hibernate的Transaction API .
// BMT idiom
Session sess = factory.openSession();
Transaction tx = null;
try {
tx = sess.beginTransaction();
// do some work
...
tx.commit();
}
catch (RuntimeException e) {
if (tx != null) tx.rollback();
throw e; // or display error message
}
finally {
sess.close();
}
请注意,当你配置Hibernate事件工厂的时刻,在一个BMT session bean中,你应当挑选 org.hibernate.transaction.JTATransactionFactory,在一个 CMT session bean中挑选org.hibernate.transaction.CMTTransactionFactory. 记着,同时也要设置org.hibernate.transaction.manager_lookup_class.
假如你利用CMT环境,并且让容器自动同步和关闭session,你大概也但愿在你代码的差别部份利用 同一个session.普通来说,在一个非托管环境中,你可以利用一个ThreadLocal 变量来持有这个session,但是单个EJB办法调用大概会在差别的线程中履行(举例来说,一个session bean调用另一个session bean).假如你不想在利用代码中被传送Session对 象实例的问题困扰的话,那么SessionFactory 供应的 getCurrentSession()办法就很合适你,该办法返回一个绑定到JTA事件 上下文环境中的session实例.这也是把Hibernate集成到一个利用程序中的最简单的办法!这个“当 前的”session老是可以自动同步和自动关闭(不考虑上述的属性设置).我们的session/transaction 管理代码削减到以下所示:
代码内容
// CMT idiom
Session sess = factory.getCurrentSession();
// do some work
...
换句话来说,在一个托管环境下,你要做的全部的事情就是调用 SessionFactory.getCurrentSession(),然后举行你的数据拜候,把别的的工作 交给容器来做.事件在你的session bean的布置描写符中以可声明的方法来设置.session的生命周期完好 由Hibernate来管理.
对after_statement衔接释放方法有一个告诫.因为JTA标准的一个很笨拙的限制,Hibernate不大概自动清理任何未关闭的ScrollableResults 大概Iterator,它们是由scroll()或iterate()产生的.你must通过在finally块中,显式调用ScrollableResults.close()大概Hibernate.close(Iterator)办法来释放底层数据库游标.(当然,大部份程序完好可以很简单的避免在CMT代码中呈现scroll()或iterate().)
以上是“<b>Hibernate的事件和并发(二)</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |