当前位置:网站首页>终于可以一行代码也不用改了!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 架构演进和技术难点攻克。
边栏推荐
- 2016 CCPC Hangzhou Onsite
- Information Security Experiment 4: implementation of IP packet monitoring program
- ViewPager2和VIewPager的區別以及ViewPager2實現輪播圖
- Unity shader (learn more about vertex fragment shaders)
- 沙龙预告|GameFi 领域的瓶颈和解决方案
- 如何成为一名高级数字 IC 设计工程师(5-2)理论篇:ULP 低功耗设计技术精讲(上)
- How to use clipboard JS library implements copy and cut function
- VSCode+mingw64+cmake
- [Frida practice] "one line" code teaches you to obtain all Lua scripts in wegame platform
- **grafana安装**
猜你喜欢
PLC信号处理系列之开关量信号防抖FB
AI从感知走向智能认知
Pit using BigDecimal
Use 3 in data modeling σ Eliminate outliers for data cleaning
Software modeling and analysis
使用BigDecimal的坑
CentOS installs JDK1.8 and mysql5 and 8 (the same command 58 in the second installation mode is common, opening access rights and changing passwords)
Impression notes finally support the default markdown preview mode
Qualifying 3
Sqlplus garbled code problem, find the solution
随机推荐
数据库多表关联查询问题
How will fashion brands enter the meta universe?
【无标题】
软件建模与分析
Can't connect to MySQL server on '(10060) solution summary
Diffusion模型详解
JS inheritance prototype
第一讲:包含min函数的栈
Lesson 1: hardness of eggs
4、 Fundamentals of machine learning
消费互联网的产业链其实是很短的,它仅仅承接平台上下游的对接和撮合的角色
iNFTnews | 时尚品牌将以什么方式进入元宇宙?
JS judge whether checkbox is selected in the project
Detailed explanation of diffusion model
Information Security Experiment 1: implementation of DES encryption algorithm
Lesson 1: finding the minimum of a matrix
C# 初始化程序时查看初始化到哪里了示例
# Arthas 简单使用说明
在EXCEL写VBA连接ORACLE并查询数据库中的内容
Natapp intranet penetration