sharding-jdbc如何配置分析Configuration
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,sharding-jdbc如何配置分析Configuration,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Shard
千家信息网最后更新 2025年12月02日sharding-jdbc如何配置分析Configuration
sharding-jdbc如何配置分析Configuration,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
Sharding核心配置主要如下(官网):
分片规则
分片规则配置的总入口。包含数据源配置、表配置、绑定表配置以及读写分离配置等
数据源配置
真实数据源列表
表配置
逻辑表名称、数据节点与分表规则的配置
数据节点配置
用于配置逻辑表与真实表的映射关系。可分为均匀分布和自定义分布两种形式
分片策略配置
对于分片策略存有数据源分片策略和表分片策略两种维度
数据源分片策略:
对应于DatabaseShardingStrategy。用于配置数据被分配的目标数据源
表分片策略
对应于TableShardingStrategy。用于配置数据被分配的目标表,该目标表存在与该数据的目标数据源内。故表分片策略是依赖与数据源分片策略的结果的自增主键生成策略
通过在客户端生成自增主键替换以数据库原生自增主键的方式,做到分布式主键无重复。
接下来对各个核心配置进行分析:
以多主多从读写分离、表分片为例
public final class ShardingMasterSlaveConfigurationPrecise implements ExampleConfiguration { @Override public DataSource getDataSource() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); //分片表规则配置 shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration()); shardingRuleConfig.getTableRuleConfigs().add(getOrderItemTableRuleConfiguration()); //绑定分片表,主要用来路由 shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item"); //设置默认数据源分片策略 shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("user_id", new PreciseModuloShardingDatabaseAlgorithm())); //设置默认表分片策略 shardingRuleConfig.setDefaultTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", new PreciseModuloShardingTableAlgorithm())); //主从配置,支持多主多从 shardingRuleConfig.setMasterSlaveRuleConfigs(getMasterSlaveRuleConfigurations()); //创建ShardingDataSource数据源 return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), shardingRuleConfig, new Properties()); } private static TableRuleConfiguration getOrderTableRuleConfiguration() { //分片表配置 TableRuleConfiguration result = new TableRuleConfiguration(/*逻辑表*/"t_order", /*数据源名.真实表*/"ds_${0..1}.t_order_${[0, 1]}"); //自定义主键生成配置 result.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "order_id", getProperties())); return result; } private static TableRuleConfiguration getOrderItemTableRuleConfiguration() { TableRuleConfiguration result = new TableRuleConfiguration("t_order_item", "ds_${0..1}.t_order_item_${[0, 1]}"); result.setKeyGeneratorConfig(new KeyGeneratorConfiguration("SNOWFLAKE", "order_item_id", getProperties())); return result; } private static ListgetMasterSlaveRuleConfigurations() { MasterSlaveRuleConfiguration masterSlaveRuleConfig1 = new MasterSlaveRuleConfiguration("ds_0", "demo_ds_master_0", Arrays.asList("demo_ds_master_0_slave_0", "demo_ds_master_0_slave_1")); MasterSlaveRuleConfiguration masterSlaveRuleConfig2 = new MasterSlaveRuleConfiguration("ds_1", "demo_ds_master_1", Arrays.asList("demo_ds_master_1_slave_0", "demo_ds_master_1_slave_1")); return Lists.newArrayList(masterSlaveRuleConfig1, masterSlaveRuleConfig2); } private static Map createDataSourceMap() { final Map result = new HashMap<>(); result.put("demo_ds_master_0", DataSourceUtil.createDataSource("demo_ds_master_0")); result.put("demo_ds_master_0_slave_0", DataSourceUtil.createDataSource("demo_ds_master_0_slave_0")); result.put("demo_ds_master_0_slave_1", DataSourceUtil.createDataSource("demo_ds_master_0_slave_1")); result.put("demo_ds_master_1", DataSourceUtil.createDataSource("demo_ds_master_1")); result.put("demo_ds_master_1_slave_0", DataSourceUtil.createDataSource("demo_ds_master_1_slave_0")); result.put("demo_ds_master_1_slave_1", DataSourceUtil.createDataSource("demo_ds_master_1_slave_1")); return result; } private static Properties getProperties() { Properties result = new Properties(); result.setProperty("worker.id", "123"); return result; }} ShardingRuleConfiguration分片规则核心配置
@Getter@Setterpublic final class ShardingRuleConfiguration implements RuleConfiguration { //表规则配置 private CollectiontableRuleConfigs = new LinkedList<>(); //绑定表配置 private Collection bindingTableGroups = new LinkedList<>(); //广播表配置 private Collection broadcastTables = new LinkedList<>(); //默认数据源名称 private String defaultDataSourceName; //默认分库策略 private ShardingStrategyConfiguration defaultDatabaseShardingStrategyConfig; //默认分片策略 private ShardingStrategyConfiguration defaultTableShardingStrategyConfig; //默认主键生成工具类 private KeyGeneratorConfiguration defaultKeyGeneratorConfig; //主从规则配置 private Collection masterSlaveRuleConfigs = new LinkedList<>(); //数据脱敏规则配置 private EncryptRuleConfiguration encryptRuleConfig;} 分析ShardingDataSourceFactory#createDataSource中的ShardingRule配置
/** * Sharding data source factory. * * @author zhangliang */@NoArgsConstructor(access = AccessLevel.PRIVATE)public final class ShardingDataSourceFactory { /** * Create sharding data source. * * @param dataSourceMap data source map * @param shardingRuleConfig rule configuration for databases and tables sharding * @param props properties for data source * @return sharding data source * @throws SQLException SQL exception */ public static DataSource createDataSource( final MapdataSourceMap, final ShardingRuleConfiguration shardingRuleConfig, final Properties props) throws SQLException { //创建ShardingDataSource数据源,同时创建sharding rule配置 return new ShardingDataSource(dataSourceMap, new ShardingRule(shardingRuleConfig, dataSourceMap.keySet()), props); }} ShardingRule分片规则
public ShardingRule(final ShardingRuleConfiguration shardingRuleConfig, final Collection
dataSourceNames) { Preconditions.checkArgument(null != shardingRuleConfig, "ShardingRuleConfig cannot be null."); Preconditions.checkArgument(null != dataSourceNames && !dataSourceNames.isEmpty(), "Data sources cannot be empty."); this.shardingRuleConfig = shardingRuleConfig; //sharding数据源名称 shardingDataSourceNames = new ShardingDataSourceNames(shardingRuleConfig, dataSourceNames); //创建表规则集合 tableRules = createTableRules(shardingRuleConfig); //创建分组绑定表 //1.从tableRules查找 //2.是否广播表,如果是广播表,dataSourceNames.size() == 1 ? dataSourceNames.iterator().next() : shardingRuleConfig.getDefaultDataSourceName(); //3.已上两种情况都不满足,则使用默认数据源创建tableRule bindingTableRules = createBindingTableRules(shardingRuleConfig.getBindingTableGroups()); //广播表 broadcastTables = shardingRuleConfig.getBroadcastTables(); //默认分库策略 defaultDatabaseShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultDatabaseShardingStrategyConfig()); //默认表分片策略 defaultTableShardingStrategy = createDefaultShardingStrategy(shardingRuleConfig.getDefaultTableShardingStrategyConfig()); //默认主键生成工具类 defaultShardingKeyGenerator = createDefaultKeyGenerator(shardingRuleConfig.getDefaultKeyGeneratorConfig()); //创建主从规则 masterSlaveRules = createMasterSlaveRules(shardingRuleConfig.getMasterSlaveRuleConfigs()); //数据脱敏规则 encryptRule = createEncryptRule(shardingRuleConfig.getEncryptRuleConfig()); } TableRule表规则
public TableRule(final TableRuleConfiguration tableRuleConfig, final ShardingDataSourceNames shardingDataSourceNames, final String defaultGenerateKeyColumn) { //获取逻辑表 logicTable = tableRuleConfig.getLogicTable().toLowerCase(); //inline表达式解析出真实表,比如:ds_${0..1}.t_order_${[0, 1]} //解析出来为: //ds_0.t_order_0 //ds_0.t_order_1 //ds_1.t_order_0 //ds_1.t_order_1 ListdataNodes = new InlineExpressionParser(tableRuleConfig.getActualDataNodes()).splitAndEvaluate(); dataNodeIndexMap = new HashMap<>(dataNodes.size(), 1); //真实表数据节点 //1.如果没有配置真实表,则根据逻辑表、数据源来生成对应真实表数据节点 //2.否则根据inline表达式解析出来的真实表来生成真实数据节点 actualDataNodes = isEmptyDataNodes(dataNodes) ? generateDataNodes(tableRuleConfig.getLogicTable(), shardingDataSourceNames.getDataSourceNames()) : generateDataNodes(dataNodes, shardingDataSourceNames.getDataSourceNames()); //真实表 actualTables = getActualTables(); //数据源->分片策略 databaseShardingStrategy = null == tableRuleConfig.getDatabaseShardingStrategyConfig() ? null : ShardingStrategyFactory.newInstance(tableRuleConfig.getDatabaseShardingStrategyConfig()); //表->分片策略 tableShardingStrategy = null == tableRuleConfig.getTableShardingStrategyConfig() ? null : ShardingStrategyFactory.newInstance(tableRuleConfig.getTableShardingStrategyConfig()); //主键字段 generateKeyColumn = getGenerateKeyColumn(tableRuleConfig.getKeyGeneratorConfig(), defaultGenerateKeyColumn); //生成主键工具类,比如SNOWFLAKE shardingKeyGenerator = containsKeyGeneratorConfiguration(tableRuleConfig) ? new ShardingKeyGeneratorServiceLoader().newService(tableRuleConfig.getKeyGeneratorConfig().getType(), tableRuleConfig.getKeyGeneratorConfig().getProperties()) : null; }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
配置
数据
数据源
策略
规则
生成
节点
逻辑
目标
广播
分析
主从
名称
工具
核心
分库
表达式
分配
帮助
支持
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全员学什么
华为软件开发对应测试
境外公司提供服务器
es数据库搭建
服务器安全级别分类
中国的网络安全
软件开发平台案例
广东江门零件加工管理软件开发
蝴蝶谷软件开发商
toard 导出数据库
鼓动群众参加网络安全宣传
车神互联网科技有限公司
成都大合网络技术有限公司
数据库系统特征包括
英灵神殿加入服务器ip
银行软件开发怎样
长沙软件开发公司多吗
浙江统一软件开发标准
倒卖服务器数据未遂犯法吗
修谱软件开发
数据库字段判断为空
远程服务器上任务管理器在哪儿
重庆巫山生鲜类的软件开发
上海市码头网络技术有限公司
幼儿园网络安全教育日
我的世界基岩版服务器长啥样
两会期间网络安全工作情况
网络安全制度
全民网络安全日观后感
修谱软件开发