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还定义了很多常量,看起来是随机数的,应该是定义了事务的状态,后续可以深入了解一下,

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容