当前位置:网站首页>终于可以一行代码也不用改了!ShardingSphere 原生驱动问世
终于可以一行代码也不用改了!ShardingSphere 原生驱动问世
2022-07-07 07:10:00 【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 官网:
作者
张亮,SphereEx CEO,Apache ShardingSphere PMC Chair。主要负责 ShardingSphere 架构演进和技术难点攻克。
边栏推荐
- Loxodonframework quick start
- How to become a senior digital IC Design Engineer (1-6) Verilog coding Grammar: Classic Digital IC Design
- Lesson 1: hardness of eggs
- Strategic cooperation subquery becomes the secret weapon of Octopus web browser
- 有没有大佬帮忙看看这个报错,有啥排查思路,oracle cdc 2.2.1 flink 1.14.4
- 14th test
- CodeForces - 1324D Pair of Topics(二分或双指针)
- JS inheritance prototype
- 面试被问到了解哪些开发模型?看这一篇就够了
- Oracle installation enhancements error
猜你喜欢
农牧业未来发展蓝图--垂直农业+人造肉
[4G/5G/6G专题基础-147]: 6G总体愿景与潜在关键技术白皮书解读-2-6G发展的宏观驱动力
JS reverse tutorial second issue - Ape anthropology first question
其实特简单,教你轻松实现酷炫的数据可视化大屏
First issue of JS reverse tutorial
MongoDB怎么实现创建删除数据库、创建删除表、数据增删改查
Information Security Experiment 1: implementation of DES encryption algorithm
Diffusion模型详解
EXT2 file system
H5 web player easyplayer How does JS realize live video real-time recording?
随机推荐
**Grafana installation**
Database multi table Association query problem
Lesson 1: hardness of eggs
第十四次试验
CDZSC_2022寒假个人训练赛21级(1)
PostgreSQL创建触发器的时候报错,
Unity shader (data type in cghlsl)
Huffman encoded compressed file
thinkphp数据库的增删改查
消费互联网的产业链其实是很短的,它仅仅承接平台上下游的对接和撮合的角色
How to speed up video playback in browser
软件建模与分析
ComputeShader
Upload taro pictures to Base64
4、 Fundamentals of machine learning
Arthas simple instructions
Information Security Experiment 1: implementation of DES encryption algorithm
How to solve the problem of golang select mechanism and timeout
Information Security Experiment 2: using x-scanner scanning tool
沙龙预告|GameFi 领域的瓶颈和解决方案