Spring事务管理高级应用难点剖析: 第2部分 - 编程入门网
这些不能被 Spring 事务增强的方法和可被 Spring 事务增强的方法唯一的区别在 “是否可以主动启 动一个新事务”:前者不能而后者可以。对于事务传播行为来说,二者是完全相同的,前 者也和后者一样不会造成数据连接的泄漏问题。换句话说,如果这些“特殊方法” 被无事务上下文的方法调用,则它们就工作在无事务上下文中;反之,如果被具有事务上下文 的方法调用,则它们就工作在事务上下文中。 对于 private 的方法,由于最终都会被 public 方法封装后再开放给外部调用,而 public 方法是可以被事务增强的,所以基本上没有 什么问题。在实际开发中,最容易造成隐患的是基于 CGLib 的动态代理时的“public static”和“public final”这两种特殊方法。原因是它们本身是 public 的 ,所以可以直接被外部类(如 Web 层的 Controller 类)调用,只要调用者没有事务上下文, 这些特殊方法也就以无事务的方式运作。 小结 在本文中,我们通过剖析了解到 以下的真相: 混合使用多个数据访问技术框架的最佳组合是一个 ORM 技术框架(如 Hibernate 或 JPA 等)+ 一个 JDBC 技术框架(如 Spring JDBC 或 iBatis)。直接使用 ORM 技术框架对应的事务管理器就可以了,但必须考虑 ORM 缓存同步的问题; Spring AOP 增强有两个方案:其一为基于接口的动态代理,其二为基于 CGLib 动态生成子类的代理。由于 Java 语法的特性,有些特殊方法不能被 Spring AOP 代理,所以也就无法享受 AOP 织入带来 的事务增强。 在下一篇文章中,笔者将继续分析 Spring 事务管理的以下难点: 直接获取 Connection 时,哪些情况会造成数据连接的泄漏,以及如何应对; 除 Spring JDBC 外,其它数据访问技术数据连接泄漏的应对方案。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |