终于可以一行代码也不用改了!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 驱动

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

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

GitHub issue:

贡献指南:

中文社区:

Apache ShardingSphere 官网:

SphereEx 官网:

Original: https://www.cnblogs.com/sphereex/p/16450093.html
Author: SphereEx
Title: 终于可以一行代码也不用改了!ShardingSphere 原生驱动问世

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622761/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Redis-数据结构

    Redis key-value结构组织 首先,Redis使用了一个全局哈希表来保存所有的键值对。这个全局哈希表,也就是一个存放哈希桶(entry)的数组。Redis可以用哈希算法算…

    数据库 2023年6月11日
    0127
  • Java关键字总结(一)

    static总结: 1、修饰静态变量,通过类名.变量名,不需要实例化对象,属于静态资源,所有类实例共享 2、修饰静态方法,通过类名.方法,不需要实例化对象,属于静态资源,所有类实例…

    数据库 2023年6月6日
    0173
  • Redis集群(三)集群模式

    一、 集群的作用 集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。 集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点…

    数据库 2023年6月11日
    0131
  • ElasticSearch详解

    什么是ElasticSearch ElasticSearch是一款非常强大的、基于Lucene的开源搜素及分析引擎;它是一个实时的分布式搜索分析引擎。它通常被用作全文检索、结构化搜…

    数据库 2023年6月6日
    0152
  • 文件传输工具:FileZilla的使用

    FileZilla FileZilla 是一款高效的 FTP 客户端工具。FileZilla 可以帮助您将本地计算机上的文件上传到虚拟主机实例中。 FileZilla 界面介绍 如…

    数据库 2023年6月11日
    0147
  • 代码随想录-数组篇

    上次刷没刷完整,和李哥做字节的题感觉先前刷的题白刷了,故打算从头到尾完整走一遍。 二分法 1-1.二分查找 力扣题目链接 给定一个 n 个元素有序的(升序)整型数组 nums 和一…

    数据库 2023年6月14日
    0168
  • MySQL 分区表,为什么分区键必须是主键的一部分?

    随着业务的不断发展,数据库中的数据量会越来越大,相应地,单表中的数据量也会越来越大,达到临界值时,单表的查询性能会下降。 [En] With the continuous deve…

    数据库 2023年5月24日
    0131
  • 折腾 2 年多!我们终于见面了!

    2018年3月,我与张老师就这么在微信上聊了起来,起初我并没有写书的打算,我们之间只是通过讨论、交流的形式聊聊关于出书的方方面面。最终,敌不过张老师超强的专业能力、细致的解说与盛情…

    数据库 2023年6月9日
    0231
  • English words chapter 20220927

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16736392.html Or…

    数据库 2023年6月11日
    0147
  • java面试题总结

    1,集合类面试题 arraylist和linkedlist的区别?底层实现?手写实现?线程安全吗以及原因? hashmap的底层实现?put()执行过程?put null时的执行过…

    数据库 2023年6月11日
    0136
  • Java学习-第一部分-第二阶段-第四节:常用类

    常用类 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 包装类 包装类的分类 针对八种基本数据类型相应的引用类型…

    数据库 2023年6月11日
    0177
  • Python第二十四天 binascii模块

    Python第二十四天 binascii模块 binascii用来进行进制和字符串之间的转换 hex(512) # 10进制转16进制 ‘0x200’int…

    数据库 2023年6月9日
    0151
  • 设计模式之(12)——外观模式

    外观模式(facadePattern)又叫门面模式,隐藏了子系统的复杂实现,为子系统中的一组接口提供了一个统一的访问入口,使得子系统容易被访问或使用,说白了就是把复杂的子系统封装成…

    数据库 2023年6月14日
    0133
  • 【转】 一条 SQL 的执行过程详解

    MySQL 体系架构 – 连接池组件 1、负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行。 …

    数据库 2023年5月24日
    0173
  • MySQL实战45讲 20

    20 | 幻读是什么,幻读有什么问题? 建表和初始化语句如下 CREATE TABLE t ( id int(11) NOT NULL, c int(11) DEFAULT NUL…

    数据库 2023年6月14日
    099
  • 【必知必会】手把手教你配置MySQL环境变量——图文详解

    一、先决条件 假设我们已经成功安装MySQL数据库。如果还有小伙伴不知道如何安装MySQL数据库,可以在本文下留言,留言数超20,则出一期”手把手教你安装MySQL数据…

    数据库 2023年6月14日
    0142
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球