分库分表一哥ShardingSphere,一文带你搞透 上(建议美术品)
城西娱乐新闻网 2025-07-31
java示举例
import com.zaxxer.hikari.HikariDataSource;import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration;import org.apache.shardingsphere.shardingjdbc.api.ShardingdataSourceFactory;import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;import java.util.Properties;public class Demo1 { public static void main(String[] args) throws SQLException { /** * 1、固定式真实世界统计数据集 */ MapDataSource> dataSourceMap = new HashMap<>(); dataSourceMap.put("ds0", dataSource1()); /** * 2.固定式备注的前提 */ TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order", "ds0.t_order_$->{0..1}"); // 以外备注的重置意图(重置URL+重置插值) orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 2}")); /** * 3、重置前提 */ ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); //将备注的重置前提申请加入到重置前提列备注 shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig); /** * 4、固定式一些表征 */ Properties props = new Properties(); //转换器sql props.put(ConfigurationPropertyKey.SQL_SHOW.getKey(), true); /** * 5、创建者统计数据集 */ DataSource dataSource = ShardingDataSourceFactory. createDataSource(dataSourceMap, shardingRuleConfig, props); /** * 6、给与连结,执唯sql */ Connection connection = dataSource.getConnection(); connection.setAutoCommit(false); /** * 次测试向t_order备注放入8条统计数据,8条统计数据就会高度集中到2个备注 */ PreparedStatement ps = connection.prepareStatement("insert into t_order (order_id,user_id,price) values (?,?,?)"); for (long i = 1; i <= 8; i++) { int j = 1; ps.setLong(j++, i); ps.setLong(j++, i); ps.setLong(j, 100 * i); System.out.println(ps.executeUpdate()); } connection.commit(); ps.close(); connection.close(); } private static DataSource dataSource1() { HikariDataSource dataSource1 = new HikariDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setJdbcUrl("jdbc:mysql://localhost:3306/sj_ds0?characterEncoding=UTF-8"); dataSource1.setUsername("root"); dataSource1.setPassword("root123"); return dataSource1; }}运唯转换器
Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds0 ::: insert into t_order_1 (order_id,user_id,price) values (?, ?, ?) ::: [1, 1, 100]1Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds0 ::: insert into t_order_0 (order_id,user_id,price) values (?, ?, ?) ::: [2, 2, 200]1Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds0 ::: insert into t_order_1 (order_id,user_id,price) values (?, ?, ?) ::: [3, 3, 300]1Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds0 ::: insert into t_order_0 (order_id,user_id,price) values (?, ?, ?) ::: [4, 4, 400]1 4.3、举例子2:多库多备注消费
2个库:sj_ds0、sj_ds1
2个库中的都都有2个备注:t_order_0,t_order_1
根据 user_id%2 TCP库,根据 order_id%2TCP备注。
执唯sql
drop database if exists sj_ds0;create database sj_ds0;use sj_ds0;drop table if exists t_order_0;create table t_order_0( order_id bigint not null primary key, user_id bigint not null, price bigint not null);drop table if exists t_order_1;create table t_order_1( order_id bigint not null primary key, user_id bigint not null, price bigint not null);drop database if exists sj_ds1;create database sj_ds1;use sj_ds1;drop table if exists t_order_0;create table t_order_0( order_id bigint not null primary key, user_id bigint not null, price bigint not null);drop table if exists t_order_1;create table t_order_1( order_id bigint not null primary key, user_id bigint not null, price bigint not null);示举例
import com.zaxxer.hikari.HikariDataSource;import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStrategyConfiguration;import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;import java.util.Properties;public class Demo2 { public static void main(String[] args) throws SQLException { // 固定式真实世界统计数据集 Map dataSourceMap = new HashMap<>(); dataSourceMap.put("ds0", dataSource1()); dataSourceMap.put("ds1", dataSource2()); /** * 2.固定式备注的前提 */ TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order", "ds$->{0..1}.t_order_$->{0..1}"); // 以外db的重置意图(重置URL+重置插值) orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds$->{user_id % 2}")); // 以外备注的重置意图(重置URL+重置插值) orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order_$->{order_id % 2}")); /** * 3、重置前提 */ ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); //将备注的重置前提申请加入到重置前提列备注 shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig); /** * 4、固定式一些表征 */ Properties props = new Properties(); //转换器sql props.put(ConfigurationPropertyKey.SQL_SHOW.getKey(), true); /** * 5、创建者统计数据集 */ DataSource dataSource = ShardingDataSourceFactory. createDataSource(dataSourceMap, shardingRuleConfig, props); /** * 6、给与连结,执唯sql */ Connection connection = dataSource.getConnection(); connection.setAutoCommit(false); PreparedStatement ps = connection.prepareStatement("insert into t_order (order_id,user_id,price) values (?,?,?)"); // 放入4条统计数据次测试,每个备注就会落入1条统计数据 for (long user_id = 1; user_id <= 2; user_id++) { for (long order_id = 1; order_id <= 2; order_id++) { int j = 1; ps.setLong(j++, order_id); ps.setLong(j++, user_id); ps.setLong(j, 100); System.out.println(ps.executeUpdate()); } } connection.commit(); ps.close(); connection.close(); } private static DataSource dataSource1() { HikariDataSource dataSource1 = new HikariDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setJdbcUrl("jdbc:mysql://localhost:3306/sj_ds0?characterEncoding=UTF-8"); dataSource1.setUsername("root"); dataSource1.setPassword("root123"); return dataSource1; } private static DataSource dataSource2() { HikariDataSource dataSource1 = new HikariDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setJdbcUrl("jdbc:mysql://localhost:3306/sj_ds1?characterEncoding=UTF-8"); dataSource1.setUsername("root"); dataSource1.setPassword("root123"); return dataSource1; }}3唯关化学键示举例
运唯转换器
Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds1 ::: insert into t_order_1 (order_id,user_id,price) values (?, ?, ?) ::: [1, 1, 100]1Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds1 ::: insert into t_order_0 (order_id,user_id,price) values (?, ?, ?) ::: [2, 1, 100]1Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds0 ::: insert into t_order_1 (order_id,user_id,price) values (?, ?, ?) ::: [1, 2, 100]1Logic SQL: insert into t_order (order_id,user_id,price) values (?,?,?)Actual SQL: ds0 ::: insert into t_order_0 (order_id,user_id,price) values (?, ?, ?) ::: [2, 2, 100]1 4.4、举例子3:单库无分备注前提若备注未以外重置前提,则直接TCP到相同的备注。
sql开发人员
sj_ds0 库中的有 t_user 备注
drop database if exists sj_ds0;create database sj_ds0;use sj_ds0;drop table if exists t_user;create table t_user( id bigint not null primary key auto_increment, name varchar(128) not null);示举例
import com.zaxxer.hikari.HikariDataSource;import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;import java.util.Properties;public class Demo3 { public static void main(String[] args) throws SQLException { /** * 1.固定式真实世界统计数据集 */ Map dataSourceMap = new HashMap<>(); dataSourceMap.put("ds0", dataSource1()); /** * 2、无重置前提 */ /** * 3、重置前提 */ ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); /** * 4、固定式一些表征 */ Properties props = new Properties(); //转换器sql props.put(ConfigurationPropertyKey.SQL_SHOW.getKey(), true); /** * 5、创建者统计数据集 */ DataSource dataSource = ShardingDataSourceFactory. createDataSource(dataSourceMap, shardingRuleConfig, props); Connection connection = dataSource.getConnection(); connection.setAutoCommit(false); PreparedStatement ps = connection.prepareStatement("insert into t_user (name) values (?)"); ps.setString(1, "张三"); System.out.println(ps.executeUpdate()); connection.commit(); ps.close(); connection.close(); } private static DataSource dataSource1() { HikariDataSource dataSource1 = new HikariDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setJdbcUrl("jdbc:mysql://localhost:3306/sj_ds0?characterEncoding=UTF-8"); dataSource1.setUsername("root"); dataSource1.setPassword("root123"); return dataSource1; }}运唯转换器
Logic SQL: insert into t_user (name) values (?)Actual SQL: ds0 ::: insert into t_user (name) values (?) ::: [张三]4.5、举例子4:多库无分备注前提消费
2个库:sj_ds0、sj_ds1
2个库中的都都有备注:t_user
t_user备注不以外TCP前提的情况下,向t_user备注存储统计数据就会落入哪个库呢?来看下精准度
sql
drop database if exists sj_ds0;create database sj_ds0;use sj_ds0;drop table if exists t_user;create table t_user( id bigint not null primary key auto_increment, name varchar(128) not null);drop database if exists sj_ds1;create database sj_ds1;use sj_ds1;drop table if exists t_user;create table t_user( id bigint not null primary key auto_increment, name varchar(128) not null);java示举例
下面固定式2个统计数据集,向t_user备注放入统计数据,想到统计数据就会落在哪个库?
import com.zaxxer.hikari.HikariDataSource;import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;import org.apache.shardingsphere.underlying.common.config.properties.ConfigurationPropertyKey;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map;import java.util.Properties;public class Demo4 { public static void main(String[] args) throws SQLException { /** * 1.固定式2个统计数据集 */ Map dataSourceMap = new LinkedHashMap<>(); dataSourceMap.put("ds0", dataSource1()); dataSourceMap.put("ds1", dataSource2()); /** * 2、无重置前提 */ /** * 3、重置前提 */ ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); /** * 4、固定式一些表征 */ Properties props = new Properties(); //转换器sql props.put(ConfigurationPropertyKey.SQL_SHOW.getKey(), true); /** * 5、创建者统计数据集 */ DataSource dataSource = ShardingDataSourceFactory. createDataSource(dataSourceMap, shardingRuleConfig, props); Connection connection = dataSource.getConnection(); connection.setAutoCommit(false); //放入4条统计数据,次测试精准度 for (int i = 0; i < 4; i++) { PreparedStatement ps = connection.prepareStatement("insert into t_user (name) values (?)"); ps.setString(1, "张三"); System.out.println(ps.executeUpdate()); } connection.commit(); connection.close(); } private static DataSource dataSource1() { HikariDataSource dataSource1 = new HikariDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setJdbcUrl("jdbc:mysql://localhost:3306/sj_ds0?characterEncoding=UTF-8"); dataSource1.setUsername("root"); dataSource1.setPassword("root123"); return dataSource1; } private static DataSource dataSource2() { HikariDataSource dataSource1 = new HikariDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setJdbcUrl("jdbc:mysql://localhost:3306/sj_ds1?characterEncoding=UTF-8"); dataSource1.setUsername("root"); dataSource1.setPassword("root123"); return dataSource1; }}运唯转换器
转换器如下,落入的库是不确定的。
Logic SQL: insert into t_user (name) values (?)Actual SQL: ds1 ::: insert into t_user (name) values (?) ::: [张三]1Logic SQL: insert into t_user (name) values (?)Actual SQL: ds1 ::: insert into t_user (name) values (?) ::: [张三]1Logic SQL: insert into t_user (name) values (?)Actual SQL: ds0 ::: insert into t_user (name) values (?) ::: [张三]1Logic SQL: insert into t_user (name) values (?)Actual SQL: ds1 ::: insert into t_user (name) values (?) ::: [张三]15、重置弊端?上会讲解的举例子,db的TCP、备注的TCP都是采用取同调群的作法,这种作法不存在一个弊端:
当查询条件是>, =, <=、BETWEEN AND的时候,就无能为力了,此时要用其他的重置意图来解决,下面来想到如何解决。
6、重置6.1、重置化学键可用重置的检索URL,是将检索(备注)水平分出的关化学键URL。举例:将供货备注中的的供货标识符的以此类推取同调群重置,则供货标识符为重置URL。SQL中的如果无重置URL,将执唯全TCP,性能较差。除了对单重置URL的反对,ShardingSphere也反对根据多个URL进唯重置。
6.2、重置插值通过重置插值将统计数据重置,反对通过=、>=、<=、>、<、BETWEEN和IN重置。重置插值需广泛应用方开发团队自唯实现,可实现的灵活度非常高。
以外共享4种重置插值。由于重置插值和业务实现紧密涉及,因此仍未共享内置重置插值,而是通过重置意图将各种一幕浓缩出来,共享更好级别的直观,并共享以太网让广泛应用开发团队自唯实现重置插值。
精确重置插值相同PreciseShardingAlgorithm,可用处理过程可用基本上化学键作为重置化学键的=与IN进唯重置的一幕。需适切StandardShardingStrategy可用。
全域重置插值相同RangeShardingAlgorithm,可用处理过程可用基本上化学键作为重置化学键的BETWEEN AND、>、=、<=进唯重置的一幕。需适切StandardShardingStrategy可用。
比如说是重置插值相同ComplexKeysShardingAlgorithm,可用处理过程可用多化学键作为重置化学键进唯重置的一幕,都有多个重置化学键的逻辑较复杂,需广泛应用开发团队自唯处理过程其中的的复杂度。需适切ComplexShardingStrategy可用。
Hint重置插值相同HintShardingAlgorithm,可用处理过程可用Hint唯重置的一幕。需适切HintShardingStrategy可用。
6.3、5种重置意图都有重置化学键和重置插值,由于重置插值的自主权,将其实质上抽离。似乎可可用重置该系统设计的是重置化学键 + 重置插值,也就是重置意图。以外共享5种重置意图。
唯备注达式重置意图(InlineShardingStrategy)相同InlineShardingStrategy。可用Groovy的备注达式,共享对SQL运算符中的的=和IN的重置该系统设计反对,只反对单重置化学键。对于简便的重置插值,可以通过简便的固定式可用,从而防止繁复的Java示举例开发,如: t_user_$->{u_id % 8} 备注示t_user备注根据u_id同调群8,而分成8张备注,备注称谓为t_user_0到t_user_7。
标准规范重置意图(StandardShardingStrategy)相同StandardShardingStrategy。共享对SQL运算符中的的=,>, =, , =, <=重置,如果不固定式RangeShardingAlgorithm,SQL中的的BETWEEN AND将按照全库TCP处理过程。
比如说是重置意图(ComplexShardingStrategy)相同ComplexShardingStrategy。比如说是重置意图。共享对SQL运算符中的的=,>, =, <=, IN和BETWEEN AND的重置该系统设计反对。ComplexShardingStrategy反对多重置化学键,由于多重置化学键二者之间的关系复杂,因此仍未进唯过多的封装,而是直接将重置化学键值组合以及重置该系统设计符透传至重置插值,几乎由广泛应用开发团队实现,共享最大的灵活度。
Hint重置意图(HintShardingStrategy)相同HintShardingStrategy。通过Hint以外重置值而非从SQL中的浓缩出重置值的作法进唯重置的意图。
不重置意图相同NoneShardingStrategy。不重置的意图。
6.4、SQL Hint对于重置URL非SQL决定,而由其他机内条件决定的一幕,可可用SQL Hint灵活的汇入重置URL。举例:实际上该系统,按照公司员工选定标识符分库,而检索中的并无此URL。SQL Hint反对通过Java API和SQL原文(待实现)两种作法可用。
书名URL:
。成都甲状腺去哪看3D可视化
杭州比较好的妇科医院
重庆白癜风医院哪家比较专业
小孩鼻炎吃再林阿莫西林颗粒有用吗
钇90
钇90副作用
肝癌中晚期最佳治疗方案是什么
钇90介入疗法费用多少
钇90
-
美股收盘:美股大幅收高,纳指、标普调高逾3%,银行板块强势领调高
八卦 2025-10-23钛电子媒体App 6月25日消息,美股大幅收高,道指暴涨2.68%,纳指暴涨3.34%,标普暴涨3.06%。银行板块稳健领暴涨,富国银行暴涨7.57%,高盛暴涨5.8%,雷曼兄弟暴涨5.2%,花
-
又一轮加息在恰巧?华尔街通胀交易专家胡刚:7月或仍将加息75bp
星闻 2025-10-23了;而且SARS期间新泽西州当局给居民发没钱搞量化严格(QE)也可不了,且开始缩表退造出QE。因素物价的生产力后端主要诱因都解决问题了,但为何物价迟迟无法升更高? 胡刚 : 很多东西的物
-
中山公用:拟5.67亿元打造总部大厦,计划7571万至1.51亿元回购公司控股公司
综艺 2025-10-23中山公用6同年24日暂定,一些公司拟以不最少5.67亿元的市价租用广东省中山市翠亨新区远方路8号万滨万潮广场二期项目其余部分物业,打造带入集科创教育中心、特质调度教育中心于主体的一些集团总部大厦
-
河南省财政拒绝执行规上工业企业满负荷奖励资金2.15亿元
八卦 2025-10-23河南日报采访 曾鸣 6月24日,采访从省份支出厅谎称,为加长稳轻工业惠行业强力,积极促成行业装配经营管理,省份支出下达2022年下半年规上轻工业行业满负荷装配支出加分款项2.15亿
-
川恒股份:创建合资公司联合开展六氟磷酸锂业务
时尚 2025-10-23川恒股份6月24日公告,公司及其控股控股公司贵州省恒达采矿业控股合资(以下简称“恒达采矿业”)成之与国轩控股集团合资(以下简称“国轩集团”)合资企业最初原设控股公司。最初原设公司注册资本3亿元,