千家信息网

Sharding中怎么利用JDBC实现强制路由

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章给大家介绍Sharding中怎么利用JDBC实现强制路由,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。分库策略package com.zero.sharding.shar
千家信息网最后更新 2025年02月01日Sharding中怎么利用JDBC实现强制路由

这篇文章给大家介绍Sharding中怎么利用JDBC实现强制路由,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

分库策略

package com.zero.sharding.shardingrule;import java.util.Collection;import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm;import org.apache.shardingsphere.api.sharding.hint.HintShardingValue;import com.google.common.collect.Sets;public class UserIdDataBaseHintAlgorithm implements HintShardingAlgorithm {        @Override        public Collection doSharding(Collection availableTargetNames,                        HintShardingValue shardingValue) {                Collection databaseSet = Sets.newConcurrentHashSet();                Collection orderIds = shardingValue.getValues();                for(Long orderId:orderIds){                        if( orderId == 1l){                                databaseSet.add("sharding1");                        }                }                //TODO 根据传进来的分片值 路由到对应的物理库                return databaseSet;        }}

分表策略

package com.zero.sharding.shardingrule;import java.util.Collection;import java.util.List;import org.apache.shardingsphere.api.sharding.hint.HintShardingAlgorithm;import org.apache.shardingsphere.api.sharding.hint.HintShardingValue;import com.google.common.collect.Sets;public class OrderIdTableHintAlgorithm implements HintShardingAlgorithm {        @Override        public Collection doSharding(Collection availableTargetNames,                        HintShardingValue shardingValue) {                Collection tableSet = Sets.newConcurrentHashSet();                Collection orderIds = shardingValue.getValues();                for(Long orderId:orderIds){                        if( orderId == 2l){                                tableSet.add("t_order0");                        }                }                //TODO 根据传进来的分片值 路由到对应的物理表                return tableSet;        }}

配置

#数据源spring.shardingsphere.datasource.names=sharding0,sharding1#默认数据源spring.shardingsphere.sharding.default-data-source-name=sharding0# 显示sqlspring.shardingsphere.props.sql.show=true#sharding0数据源配置spring.shardingsphere.datasource.sharding0.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.sharding0.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.sharding0.url=jdbc:mysql://**:3306/sharding0?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULLspring.shardingsphere.datasource.sharding0.username=rootspring.shardingsphere.datasource.sharding0.password=**#sharding1 数据源配置spring.shardingsphere.datasource.sharding1.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.sharding1.driver-class-name=com.mysql.cj.jdbc.Driverspring.shardingsphere.datasource.sharding1.url=jdbc:mysql://**:3306/sharding1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULLspring.shardingsphere.datasource.sharding1.username=rootspring.shardingsphere.datasource.sharding1.password=**#hint 强制路由spring.shardingsphere.sharding.tables.t_order.database-strategy.hint.algorithm-class-name=com.zero.sharding.shardingrule.UserIdDataBaseHintAlgorithmspring.shardingsphere.sharding.tables.t_order.table-strategy.hint.algorithm-class-name=com.zero.sharding.shardingrule.OrderIdTableHintAlgorithm# 分布式主键 内置的支持这三种 SNOWFLAKE/UUID/LEAF_SEGMENTspring.shardingsphere.sharding.tables.t_order.key-generator.column=idspring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKE

使用示例

      @Test        public void testShardingRead(){                OrderExample ex = new OrderExample();                ex.createCriteria().andUserIdEqualTo(1l).andOrderIdEqualTo(1l);                                HintManager hintManager = HintManager.getInstance();                hintManager.addDatabaseShardingValue("t_order", 1l);                hintManager.addTableShardingValue("t_order", 2l);                                List orders = orderMapper.selectByExample(ex);                orders.stream().forEach(o->{                        System.out.println("userId:"+o.getUserId() + " orderId:" + o.getOrderId());                });                                hintManager.close();        }

关于Sharding中怎么利用JDBC实现强制路由就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0