在session bean中跨数据库的事务处理的解决,我又学习了一些资料,觉得在ejb中异常的处理还是有许多要注意的地方。
在ejb中通常分两类异常,一类为系统异常,一类为应用程序异常(这里暂不包含JVM的异常,对 JVM 异常我们一般也无能为力),对于应用程序的异常,ejb容器不会去自动处理,这就象我在上篇blog中说的,当我们在进行跨数据库操作时抛出了SQLException异常,容器不会管,所以做不到事务的回滚,我们必须要手动的调用sessionContext的方法来让容器处理异常,达到事务的一致性;而对于系统异常,ejb容器是会自动去处理的,即使我们对它进行了catch,ejb容器仍然会知道,会去处理,所以这给了我们处理跨数据库操作维持事务的第二种方法,就是我们在ejb方法中捕获我们实际操作数据库的异常然后重新抛出一个系统异常,例如EJBException,这样容器就会察觉接手处理,从而达到跨数据库事务的自动维护。在这里有个细节就是我要是在业务逻辑处理中抛出EJBException,而在ejb方法中手动进行了catch,则此时容器是不会觉察到系统异常的,但如果我仍在dao中抛出ejbexception,我在session bean中调用它,竟然不用手写catch,容器会自动捕获进行处理,并且能做到事务的维护,当然我在dao中抛出一个ejbexception会显的极不合适;所以最好还是在ejb方法中捕获dao抛出的应用程序异常,而在catch中抛出一个ejbexception,让容器去处理,事实上这时你是不能再在ejb方法中去catch这个ejbexception了,容器不让你这样写代码。
可见ejb容器的异常处理还是挺完备的(有点象废话
),对于其完善的异常处理和声名性事务管理还要再学习学习。
![](http://meisong2005.spaces.live.com/mmm2006-07-28_14.20/rte/emoticons/smile_teeth.gif)
慢慢发现ejb还是有很多值得学习和使用的地方,并非现在所谓的轻量级解决方案所说的一无事处,
,关于其在分布式系统中的应用有时间真应该花点时间好好研究一下!!
![](http://meisong2005.spaces.live.com/mmm2006-07-28_14.20/rte/emoticons/smile_teeth.gif)