乐趣区

关于shardingsphere:终于可以一行代码也不用改了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()) {// ...}
    }
}

应用数据库连接池

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 驱动

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 架构演进和技术难点攻克。

退出移动版