一、布景

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()) {
            // ...        }
    }
}

运用数据库连接池

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()) {
            // ...        }
    }
}

参考信息

  • JDBC 驱动

shardingsphere.apache.org/document/cu…

六、结语

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

以上就是本次共享的全部内容,如果有对 Apache ShardingSphere 有任何疑问或主张,欢迎在 GitHub issue 列表提出,或可前往中文社区沟通评论。

GitHub issue:

github.com/apache/shar…

奉献指南:

shardingsphere.apache.org/community/c…

中文社区:

community.sphere-ex.com/

Apache ShardingSphere 官网:

shardingsphere.apache.org/

SphereEx 官网:

www.sphere-ex.com

作者

张亮,SphereEx CEO,Apache ShardingSphere PMC Chair。主要担任 ShardingSphere 架构演进和技术难点霸占。