zoukankan      html  css  js  c++  java
  • Sharding-JDBC 水平分库

    水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器。

      (1)将原有order_db库拆分为order_db_1、order_db_2

      (2)修改分片规则

        由于数据库拆分了两个,这里需要配置两个数据源。
        分库需要配置分库的策略,和分表策略的意义类似,通过分库策略实现数据操作针对分库的数据库进行操作。

    # sharding-jdbc分片规则配置
    # 数据源,多个
    spring.shardingsphere.datasource.names = m1,m2
    
    # m1数据源
    spring.shardingsphere.datasource.m1.type = com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.m1.driver-class-name = com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.m1.url = jdbc:mysql://localhost:3306/order_db_1?useUnicode=true
    spring.shardingsphere.datasource.m1.username = root
    spring.shardingsphere.datasource.m1.password = root
    
    # m2数据源
    spring.shardingsphere.datasource.m2.type = com.alibaba.druid.pool.DruidDataSource
    spring.shardingsphere.datasource.m2.driver-class-name = com.mysql.jdbc.Driver
    spring.shardingsphere.datasource.m2.url = jdbc:mysql://localhost:3306/order_db_2?useUnicode=true
    spring.shardingsphere.datasource.m2.username = root
    spring.shardingsphere.datasource.m2.password = root
    
    # 分库策略,以user_id为分片键,分片策略为 user_id % 2 + 1,user_id为偶数操作m1数据源,否则操作m2。
    spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column = user_id
    spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression = m$->{user_id % 2 + 1}
    
    # 指定t_order表的数据分布情况,配置数据节点 m1.t_order_1,m1.t_order_2,m2.t_order_1,m2.t_order_2
    spring.shardingsphere.sharding.tables.t_order.actual-data-nodes = m$->{1..2}.t_order_$->{1..2}
    
    # 指定t_order表的主键生成策略为SNOWFLAKE(雪花算法)
    spring.shardingsphere.sharding.tables.t_order.key-generator.column = order_id
    spring.shardingsphere.sharding.tables.t_order.key-generator.type = SNOWFLAKE
    
    # 指定t_order表的分片策略,分片策略包括分片键和分片算法
    spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column = order_id
    spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression = t_order_$->{order_id % 2 + 1}
    
    # 打开sql输出日志
    spring.shardingsphere.props.sql.show = true

        分库分表策略定义方式如下:

    #分库策略,如何将一个逻辑表映射到多个数据源
    spring.shardingsphere.sharding.tables.<逻辑表名称>.database‐strategy.<分片策略>.<分片策略属性名>= #分片策略属性值
    #分表策略,如何将一个逻辑表映射为多个实际表
    spring.shardingsphere.sharding.tables.<逻辑表名称>.table‐strategy.<分片策略>.<分片策略属性名>= #分片策略属性值

        Sharding-JDBC支持以下几种分片策略:
          不管是分库还是分表,策略基本一样。
          standard :标准分片策略,对应StandardShardingStrategy。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm和RangeShardingAlgorithm两个分片算法。PreciseShardingAlgorithm是必选的,用于处理=和IN的分片。RangeShardingAlgorithm是可选的,用于处理BETWEEN AND分片,如果不配置RangeShardingAlgorithm,SQL中的BETWEEN AND将按照全库路由处理。
          complex :符合分片策略,对应ComplexShardingStrategy。复合分片策略。提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持。ComplexShardingStrategy支持多分片键,由于多分片键之间的关系复杂,因此并未进行过多的封装,而是直接将分片键值组合以及分片操作符透传至分片算法,完全由应用开发者实现,提供最大的灵活度。
          inline :行表达式分片策略,对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: t_user_$ ->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为 t_user_0 到 t_user_7 。
          hint :Hint分片策略,对应HintShardingStrategy。通过Hint而非SQL解析的方式分片的策略。对于分片字段非SQL决定,而由其他外置条件决定的场景,可使用SQL Hint灵活的注入分片字段。例:内部系统,按照员工登录主键分库,而数据库中并无此字段。SQL Hint支持通过Java API和SQL注释(待实现)两种方式使用。
          none :不分片策略,对应NoneShardingStrategy。不分片的策略。

          查看分片策略细节移步官网:https://shardingsphere.apache.org/

      (3)测试

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = {ShardingJdbcSimpleBootstrap.class})
    public class OrderDaoTest {
    
        @Autowired
        OrderDao orderDao;
    
        @Test
        public void testInsertOrder() {
            for (int i = 1; i <= 20; i++) {
                // orderDao.insertOrder(new BigDecimal(i), 1L, "SUCCESS");
                orderDao.insertOrder(new BigDecimal(i), 2L, "SUCCESS");
            }
        }
    
        @Test
        public void testSelectOrderbyIds() {
            List<Long> ids = new ArrayList<>();
            ids.add(463407813595496449L);
            ids.add(463407814530826240L);
    
            List<Map> maps = orderDao.selectOrderbyIds(ids);
            System.out.println(maps);
        }
    }
  • 相关阅读:
    The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via
    WCF传递Stream时,同时传递其它参数的问题
    DotNet NB 学习公众号
    军师旅团营连排班各有多少人
    OAuth 2.0学习
    人生三境界
    Mac OS安装Windows各版本时注意事项(2014年后的Mac机相信会有这些问题)
    C#中winform使用相对路径读取文件的方法
    Sql Server Report Service 的部署问题(Reporting Service 2014為什麼不需要IIS就可以運行)
    Reporting Services报表常用的URL参数
  • 原文地址:https://www.cnblogs.com/roadlandscape/p/12818997.html
Copyright © 2011-2022 走看看