Druid连接池源码解析(6)DruidXADataSource

1 DruidXADataSource

DruidXADataSource,顾名思义是基于 XA 协议的Datasource,XA简单来说就是两阶段提交的分布式事务。
有兴趣的可以看下 分布式事务方案(XA 2PC TCC Seata)(图画得特别好)
看了下历史版本,最早的1.0.17就已经支持了, 再翻了下提交记录,2011年就支持了,也真的是不得不佩服想得很全面。

看下类图:


DruidXADataSource.png

额外实现了JDBC的XADataSource

2 getXAConnection

同样最主要的还是获取连接的流程,先看下源码:

    @Override
    public XAConnection getXAConnection() throws SQLException {
        DruidPooledConnection conn = this.getConnection();

        Connection physicalConn = conn.unwrap(Connection.class);

        XAConnection rawXAConnection = createPhysicalXAConnection(physicalConn);

        return new DruidPooledXAConnection(conn, rawXAConnection);
    }

获取连接,获取出来的是封装过的DruidDataSource
然后unwrap获取物理连接
通过createPhysicalXAConnection获取标准的XAConnection,内部通过数据库类型的Util,根据Driver的类型、版本等,反射创建相应的instance
最后通过获取的XAConnection和DruidPooledConnection初始化DruidPooledXAConnection返回

3 分布式事务的具体实现

连接池中还是只提供标准的XAConnection接口,具体的实现还是要依赖Atomikos等框架的集成。
其中XAConnection 中有一个XAResource,其中有个Xid,应该就是用来定义事务ID的,然后定义了一系列根据xid 的commit,rollback,start,end等方法;
XAResource还定义了很多常量,看起来是随机数的,应该是定义了事务的状态,后续可以深入了解一下,

你可能感兴趣的:(Druid连接池源码解析(6)DruidXADataSource)