• 终于可以一行代码也不用改了!ShardingSphere 原生驱动问世


    一、背景

    ShardingSphereDataSourceFactory 是 Apache ShardingSphere-JDBC 端的最基础用户 API,它用于将用户的规则配置对象进行转化,并生成为标准 DataSource 的实现。除此之外,它还提供了用于 YAML 配置的 YamlShardingSphereDataSourceFactory,以及用于 Spring 的自定义命名空间和 Spring Boot Starter。

    DataSource 是标准的 Java JDBC 接口,工程师可以通过它进一步创建符合 JDBC 标准的 Connection、Statement、PreparedStatement、ResultSet 等耳熟能详的标准对象。完全符合 JDBC 接口的实现,让工程师使用 Apache ShardingSphere-JDBC 与使用原生的 JDBC 没有区别,也可以透明化的对接各种 ORM 框架

    二、痛点

    虽然标准的 JDBC 接口,可以在开发过程中完全适配,但通过 ShardingSphere API 创建 DataSource,却改变了工程师的原有的数据库驱动加载方式。虽然只需要修改少量(一行)的启动代码,但是对于希望平滑迁移至 ShardingSphere 的系统来说,切实地增加了额外的开发成本;且对于无法掌握源码的系统(如:外采系统)来说,使用 ShardingSphere 则困难重重。

    一直以来,ShardingSphere 都缺乏 JDBC 驱动的实现,这主要受限于它的设计初衷。通过 Java 配置的 ShardingSphere-JDBC 可以将灵活度提升到可编程级别,但 JDBC 的 Driver 接口则并未提供太多可额外配置的空间,仅通过 URL 和 Properties,会大幅限制 ShardingSphere 的配置灵活度。YAML 配置虽然可以和 Driver 的 URL 更好的适配,且可读性更强,但属于静态配置的范畴,与动态配置的灵活度相比,则明显不足。因此,ShardingSphere-JDBC 采用数据库连接池的相似策略,绕过了 JDBC 标准接口的限制,直接将 DataSource 暴露给用户。

    然而,改动一行代码和一行代码都不改动是不可逾越的天堑,这也成为了 ShardingSphere-JDBC 易用性的最大痛点

    三、契机

    随着 ShardingSphere 的另一款产品 —— ShardingSphere-Proxy 的逐渐成熟,它的两个重要的生态类功能——混合部署和 DistSQL 应运而生。

    ShardingSphere-JDBC 的轻量级和高性能的特性,使其更加适合于面向应用运行时的 CRUD 操作;ShardingSphere-Proxy 的易用性和兼容性,则使其更加适合于面向数据库管控的 DDL 操作。两个产品共同使用,互相取长补短,成为了更加完善的新一代架构方案。

    兼具编程和 SQL 展现力的 DistSQL,在灵活性和易用性之间取得了完美的平衡。因此,在 ShardingSphere-JDBC 的配置属性大幅降低的架构模型中,使用 JDBC 的 URL 连接治理中心,并采用 DistSQL 进行配置操作,是最佳的解决方案。DistSQL 的安全性,是 Java 和 YAML 的配置方式所不具备的,它天然支持权限控制和 SQL 审计等高阶能力,让 DBA 运维数据库集群更加得心应手。

    四、实现

    在前提条件一一达成之后,ShardingSphere-JDBC 5.1.2 版本顺势而为,提供了 JDBC 驱动。它可以仅通过配置变更即可使用,工程师再也无需修改代码

    驱动类名称

    org.apache.shardingsphere.driver.ShardingSphereDriver

    URL 配置说明

    • jdbc:shardingsphere: 为前缀

    • 配置文件:xxx.yaml,配置文件格式与 YAML 配置一致

    • 配置文件加载规则:

      • 无前缀表示从绝对路径加载配置文件

      • classpath: 前缀表示从类路径中加载配置文件

    五、使用步骤

    使用原生驱动

    Class.forName("org.apache.shardingsphere.driver.ShardingSphereDriver");
    String jdbcUrl = "jdbc:shardingsphere:classpath:config.yaml";
    
    String sql = "SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.user_id=? AND o.order_id=?";
    try (
            Connection conn = DriverManager.getConnection(jdbcUrl);
            PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setInt(1, 10);
        ps.setInt(2, 1000);
        try (ResultSet rs = preparedStatement.executeQuery()) {
            while(rs.next()) {
                // ...        }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    使用数据库连接池

    String driverClassName = "org.apache.shardingsphere.driver.ShardingSphereDriver";
    String jdbcUrl = "jdbc:shardingsphere:classpath:config.yaml";// 以 HikariCP 为例 HikariDataSource dataSource = new HikariDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setJdbcUrl(jdbcUrl);
    
    String sql = "SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.user_id=? AND o.order_id=?";
    try (
            Connection conn = dataSource.getConnection();
            PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setInt(1, 10);
        ps.setInt(2, 1000);
        try (ResultSet rs = preparedStatement.executeQuery()) {
            while(rs.next()) {
                // ...        }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    参考信息

    • JDBC 驱动

    https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/jdbc-driver/

    六、结语

    ShardingSphere-JDBC 驱动的出现,使 ShardingSphere 的易用性获得了前所未有的加强。在未来规划中,JDBC 驱动可以进一步简化,直接在 URL 中提供治理中心地址即可。Apache ShardingSphere 已大踏步向多元化的分布式集群迈进。新时代已经到来,快来体验一下 ShardingSphere 的新版本的强大功能吧!

    以上就是本次分享的全部内容,如果有对 Apache ShardingSphere 有任何疑问或建议,欢迎在 GitHub issue 列表提出,或可前往中文社区交流讨论。

    GitHub issue:

    https://github.com/apache/shardingsphere/issues

    贡献指南:

    https://shardingsphere.apache.org/community/cn/contribute/

    中文社区:

    https://community.sphere-ex.com/

    Apache ShardingSphere 官网:

    https://shardingsphere.apache.org/

    SphereEx 官网:

    https://www.sphere-ex.com

    作者

    张亮,SphereEx CEO,Apache ShardingSphere PMC Chair。主要负责 ShardingSphere 架构演进和技术难点攻克。

  • 相关阅读:
    基于JavaWeb+SpringBoot+Vue医疗器械商城微信小程序系统的设计和实现
    Rust初接触
    罗丹明 PEG 巯基,Rhodamine PEG Thiol,荧光染料标记巯基/硫醇
    linux入门6—日志分析与故障排除
    Spire.PDF 8.11.10 supports .NET 7.0 and PDF to PPTX
    爬虫项目(四):批量下载高清美女桌面壁纸
    SOLIDWORKS Composer反转关键帧实现产品安装过程
    C++——基于多态的职工管理系统
    【基本数据结构 四】线性数据结构:队列
    C++STL 顺序容器操作总结(超级详细)
  • 原文地址:https://blog.csdn.net/SphereEX/article/details/125636808