`
yesjavame
  • 浏览: 679099 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
阅读更多

在没有开始JDBC分布式事务前,先来回顾一下J2EE平台的数据源的整体构加:
在上面的介绍中,可能大家会过于限入理解如何实现ConnectionPoolDataSource和PooledConnection,而忘记了它的整体结构.为了帮助大家更快地理解,我从以下几点进行总结.
声明:本文完全是作者根据SUN的文档从实践中总结,没有参考(事实上目前我还没有找到这方面的参考)任何文章:
1.DataSource和ConnectionPoolDataSource,PooledConnection,Connection的关系:
Sun的文档中只对ConnectionPoolDataSource接口作了一般性规定,说明它是PooledConnection的工厂,即ConnectionPoolDataSource是传统的连结池角色,它负责产生物理连结PooledConnection.而PooledConnection又是Connectio的工厂,一个PooledConnection对象负责产生多个Connection对象供应用程序调用.而DataSource是对上面两个过程的包装,在DataSource中不仅要实现传统连结池ConnectionPoolDataSource来产生物理连结PooledConnection,还要实现通过每个PooledConnection工厂来产生Connection,最后DataSource通过公开方法返回给调用者的是经过两次工厂出来的Connection.如果我们先不考虑分布式事务,只看下图左边,就是说工厂ConnectionPoolDataSource生成PooledConntion,二级工厂PooledConntion生产Connection,这两个过程由DataSource在内部包装,只提供最后的产品Connection.


2.DataSource是服务端数据源,而传统的连结池是客户端数据源:
传统的连结池要调用者生成这个连池的实例,完成初如化,这样一个数据库为了防止连结池的实例生成无限多个物理连结,就要对保存物理连结的数据结构进行静态定义,否则,你在你的程序中生成一个连结池对象,它生成30个物理连结,我又在我的程序中生成连结池实例,又生成30个物理连结,那就无法控制了,所以保存这30个物理连结的数据结构必须是静态的.
而DataSource同一个对象初始化后,对象被绑定到jndi服务器上,通过jdni得到的是它的代码存根,其中只包含Connection,而物理连结是不可能序列化的,所以不会被重新生成,调用者通过Connection对象作为参数传给服务端,由它来操作实际的物理连结.

思考一下:如果不考虑性能问题,我是否可以把PooledConnction不再二次工厂化,只把PooledConntion作为Connection作为DataSource产品返回给调用者?

答案是不可以,因为物理连结不能序列化,也就是无法进行分布式引用.二次工厂化不仅解决了性能的问题,也同时解决了分布式调用的问题.

3.为什么说二次工厂化增加性能?
对于产生物理连结,没有什么区别,但物理连结本身并没有满负载工作,也就是一个物理Connection(TMD,我现在也不好说Connection还是PooledConnectio,以前的Connection就是DataSource中的PooledConnection)其实可以同时绑定更多的Statement,而如果它直接给调用者调用了,句柄就被调用者拿去了,在调用者没有返回时别的Statement没法和它进行”联系”.而二次工厂的目的就是把多人的Statement通过”新的引用Connection”和物理连结绑定,使它更好地工作.
举个例子,汽车这种东西,在目前的中国还是很昂贵的,作为客户(调用者)我有几件货物要运,但一辆汽车(物理连结)如果我一用,别人就不能用了.(传统连结池和连结),尽管它还可以装更多的货物,现在汽车公司只能你一个车号(新的Connection),不给你实际的汽车,你只要把你的几件东西只交给这个车号,而其他人也可能同时把几件东西交给这个车号,最尽有更多的货物因为使用同一车号而使那个物理汽车装载了更多的货物,当然如果它满了的话会产生另一辆车,如果生产的辆达到规定的数目你只好等等了,但这样把多个客户的货物和同一车号关联使汽车能更多地处理事务,明显地增加了性能.

理解了以上的结构,我们就不难理解javax.sql对分布式事务的支持,当然,如果你对事务本身还不理解,那我就没办法让你理解以下的知识,因为我不可能再停下来讲什么是事务.它是和JDBC相同级别的内容,也许在别的地方我会再讲.
从上面的结构中右边看到,在DataSource中,其实封装了两种工厂,这两种工厂都是两层次的,其实XADataSource的作用和ConnectioPooledDataSource一样,都是产生物理连结的,只不过它产生支持分布式事务的物理连结XAConnectio而已,(以后记住,凡以XA命名的类都是支持分布式事务的标记.)我们看到,XAConnection中getConnection()出来的连结和PooledConnection中getConnection()出来的连结没有区别,而Connection是DataSource的最终产品,这意味作什么?
这意味着支持分布式事务的过程由DataSource来做,你要操作的Connection和平时没有两样,你只要声明事务的开始和事务提交就行了!
要使你的连结支持分布式事务,你要在DataSource的配置中指明type是XADataSource就行了.然后申请一个一务(为了说明方便省略了try{}catch(){})
UserTransactionut=...........;
ut.begin();
Connectioncon1=.........;
Connectioncon2=.........;
Connectioncon3=.........;
if(条件)ut.setRollbackOnly();
con1.close();
con2.close();
con3.close();
考察一下,为什么XADataSource类型的物理工厂会产生的连结可以直接被事务管理呢?其实这就是封装的好处了,在XADataSource产生XAConnection时,这个XAConnection实际是PooledConnection的子类,它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中进行管理.对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的操作要求事务参与了,最后告诉事务说到这儿可以提交或回滚了,别的都是黑箱操作,不要你来做.

当然如果没有分布式事务的需求,虽然XADataSource可以用于本地事务,但它要做很多资源测试,是一种浪费.

最后要说明的是,既然你把操作交给事务来做,你就要对他放心,事务边界由容器管理,你只在最后确定是提交还是回滚还是强行回滚setRollbackOnly()(强行回滚后不可以再提交).你不要在事务中调用某一连结的rollback,commit,也不能把Connection设为自动提交,一般来说当你声明为支持分布式事务的DataSource时,创建的连结默认都是关闭自动提交的,只是你自己不要打开它.


因为SUN的文档只对DataSource接口作了一般规定,并没有规定具体算法,所以我们在清楚上面的结构后,可以实现不依赖容器的DataSource(其实只是它的思想.因为你写出来的不依赖容器的DataSource)已经不是这个意义上的DataSource了.它不能绑定到服务器上让远程引用,所以生成物理连结的工厂应该是静态的,而物理连结这种产品也应该是静态的.然后再生成多个引用连结.但这好象没有多大意义,因为纯客户端软件一般来说不可能同时有上万个客户在线访问的,根本用不着这么费事地实现连结池.
分享到:
评论

相关推荐

    Sharding-JDBC分布式事务应用.pdf

    Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

    Sharding-JDBC分布式事务应用

    《Sharding-JDBC分布式事务应用》是一篇关于Java领域中如何利用Sharding-JDBC实现分布式事务的专题讨论。Sharding-JDBC是阿里巴巴开源的一款轻量级数据库中间件,它为Java开发者提供了一种透明化的数据分片解决方案...

    springboot集成shardingJDBC实现分布式事务demo工程【天天打码,天天进步】

    springboot集成shardingJDBC实现分布式事务demo工程,亲测可用 使用方式见博客:https://maoqizhi.blog.csdn.net/article/details/123149268?spm=1001.2014.3001.5502

    sharding-jdbc分布式数据库培训方案

    其功能包括分库分表、读写分离和分布式主键生成,并初步实现了柔性事务。 总的来说,Sharding-JDBC 是一个强大的工具,能够帮助开发者构建可扩展的分布式数据库系统,应对大规模数据和高并发的业务场景。通过合理的...

    分布式事务若依框架文档

    - **RuoYiAT模式**:这是一种基于JDBC的自动补偿机制来实现分布式事务的方式。通过拦截资源管理器(如数据库连接)的方法调用来自动注册分支事务,简化了开发者的工作。 - **TCC模式**:TCC模式(Try-Confirm-Cancel...

    分布式事务实践 解决数据一致性

    介绍分布式事务的定义、原则和实现原则,介绍使用Spring框架实现分布式事务的几种方式,包括使用JTA、Spring事务同步、链式事务等,并通过实战介绍其实现。除此以外还介绍了一些分布式事务相关的技术,如幂等性、...

    分布式事务常用的解决方案,XA,Saga,TCC,MQ补偿.docx

    分布式事务解决方案概述 分布式事务是指在分布式系统中,事务操作跨越多个节点或服务器,需要保持事务的一致性和可靠性。分布式事务的解决方案有很多,常见的有XA、Saga、TCC和MQ补偿等。 XA(eXtended ...

    springboot多数据源即分布式事务解决方案,添加对多线程的支持

    在现代企业级应用开发中,数据源的多样化和分布式事务的处理是常见需求。Spring Boot作为Java领域的一个轻量级框架,提供了强大的支持来解决这些问题。本教程将深入探讨如何在Spring Boot环境下实现多数据源操作及...

    Spring分布式事务实现

    总结来说,Spring分布式事务实现主要依赖于Spring框架的事务管理能力、JOTM作为JTA实现的事务管理器,以及相关的JDBC驱动来连接数据库。通过声明式事务管理,开发者可以在不深入事务管理细节的情况下,编写出可靠的...

    Spring+JOTM 分布式事务管理

    在IT行业中,分布式事务管理是复杂且至关重要的一个领域,特别是在构建可扩展的、高可用性的企业级应用时。Spring框架作为一个广泛使用的Java应用程序开发框架,提供了多种支持事务管理的解决方案,其中包括集成JOTM...

    Spring3.0+Hibernate+Atomikos多数据源分布式事务管理

    因此,多数据源分布式事务管理成为了必不可少的技术。本教程将聚焦于如何利用Spring 3.0、Hibernate ORM框架以及Atomikos这个开源事务管理器来实现高效、可靠的多数据源分布式事务处理。 **Spring 3.0**: Spring是...

    使用Spring+atomikos实现分布式事务

    Spring框架提供了强大的支持来处理分布式事务,而Atomikos是一个开源的事务管理器,专门用于处理JTA(Java Transaction API)事务,尤其适用于微服务和分布式环境。本教程将探讨如何结合Spring和Atomikos来实现...

    Atomikos分布式事务处理所需jar包

    Atomikos是一个开源的事务处理系统,专门设计用于在Java应用程序中实现分布式事务管理。它提供了JTA(Java Transaction API)的实现,使得开发者能够在不同的数据源之间进行复杂的事务操作,确保数据的一致性和完整...

    基于mysql,SpringBoot 分布式事务例子

    在IT行业中,分布式事务是大型系统中不可或缺的一部分,特别是在微服务架构中,多个服务之间可能存在事务性的交互。本文将深入探讨基于MySQL和SpringBoot的分布式事务处理,以及如何通过示例进行学习。 首先,让...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    在现代企业级应用开发中,多数据源切换和分布式事务管理是常见的需求,尤其是在大型分布式系统中。Spring框架因其强大的依赖注入和AOP(面向切面编程)特性,成为Java领域首选的轻量级框架。Druid是一个优秀的数据库...

    Seata 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务

    它致力于提供高性能和简单易用的分布式事务服务,使得开发者在微服务架构或者分布式系统中能够轻松地处理分布式事务。Seata 的目标是简化分布式事务的开发过程,提高系统的可扩展性和可靠性。 在分布式环境中,事务...

    spring + JTA + JOTM实现分布式事务

    分布式事务是现代企业级应用中不可或缺的一部分,尤其是在大数据和微服务架构中,它确保了在多个数据库或资源管理系统中的数据一致性。本教程将深入探讨如何使用Spring框架、Java Transaction API (JTA) 和 Java ...

    基于Java的TCC分布式事务框架.zip

    本项目提供了一个基于TCC模式的分布式事务框架,支持多种存储方式(如JDBC、Redis、ZooKeeper等)和多种RPC框架(如Dubbo、HTTP等),并提供了丰富的示例和使用指南。 功能特性 TCC事务模式支持Try、Confirm、...

    SpringBoot整合多数据源,并实现本地分布式事务

    Spring Boot作为一款轻量级的框架,提供了一种便捷的方式来整合多种数据库,同时支持本地和分布式事务管理。下面将详细介绍如何在Spring Boot中整合多数据源并实现本地分布式事务。 一、多数据源设计 1. **配置多...

Global site tag (gtag.js) - Google Analytics