sharding-jdbc垂直分库分表实战

  • 资料
    分库分表的概念及应用场景详解
    分库分表带来的一些问题
    sharding-jdbc水平垂直分库分表环境搭建
    sharding-jdbc水平分库分表实战
    sharding-jdbc垂直分库分表实战

  • 垂直分库分表目的
    1.主从表结构拆分,也在一定程度缓解索引性能,同时可以使主从表可以并发操作,不被行锁限制(垂直分表)
    2.微服务架构情况下,为了业务更好的区分,采用多schema模式,不同模块使用不同的schema(伪垂直分库)
    3.微服务架构情况下,由于某些模块业务量非常大,导致单库性能下降,影响其它模块,一般会单独拆到另外一个库中(真垂直分库)

  • 垂直分表实现
    垂直分表就不做实验了,我们每天都在做垂直分表,比如主从表的结构

  • 垂直分库实现

    public class springJdbcTest {
          
          
        public static void main(String[] args) throws SQLException {
          
          
    
            //获取数据源
            DataSource dataSource = getDataSource();
    
            //获取jdbctemplate
            JdbcTemplate jdbcTemplate = getJdbcTemplate(dataSource);
    
    
            //执行插入语句
            for(int i=1;i<=10;i++) {
          
          
                //执行插入用户语句
                jdbcTemplate.update("insert into t_user(user_name,user_age,user_type) values (?,?,?)",i,i,i);
                //执行插入订单语句
                jdbcTemplate.update("insert into t_order(user_id,order_price) values (?,?)",i,i);
            }
    
        }
    
    
        public static JdbcTemplate getJdbcTemplate( DataSource dataSource){
          
          
            JdbcTemplate jdbcTemplate = new JdbcTemplate();
            jdbcTemplate.setDataSource(dataSource);
            return jdbcTemplate;
        }
    
        
    
        public static DataSource getDataSource() throws SQLException {
          
          
            // 配置真实数据源
            Map<String, DataSource> dataSourceMap = new HashMap<>();
    
            // 配置第 1 个数据源
            DruidDataSource dataSource1 = new DruidDataSource();
            dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource1.setUrl("jdbc:mysql://localhost:3306/ds0?characterEncoding=utf-8&useSSL=false");
            dataSource1.setUsername("root");
            dataSource1.setPassword("123456");
            dataSourceMap.put("ds0", dataSource1);
    
            // 配置第 2 个数据源
            DruidDataSource dataSource2 = new DruidDataSource();
            dataSource2.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource2.setUrl("jdbc:mysql://localhost:3307/ds0?characterEncoding=utf-8&useSSL=false");
            dataSource2.setUsername("root");
            dataSource2.setPassword("123456");
            dataSourceMap.put("ds1", dataSource2);
    
            // 配置表规则
            ShardingRuleConfiguration shardingRuleConfiguration=new ShardingRuleConfiguration();
    
            //用户表配置
            //配置逻辑表和实际表分布情况,配置用户表分布情况
            TableRuleConfiguration tableRuleConfiguration1 = new TableRuleConfiguration("t_user","ds0.t_user");
            //生成主键策略
            KeyGeneratorConfiguration keyGeneratorConfiguration1 = new KeyGeneratorConfiguration("snowflake","user_id");
            //用户表的表和库路由配置,都是单库单表情况,相当于多数据源情况,库和表都是固定
            ShardingStrategyConfiguration shardingStrategyConfiguration1 = new InlineShardingStrategyConfiguration("user_id","t_user");
            ShardingStrategyConfiguration shardingStrategyConfiguration2 = new InlineShardingStrategyConfiguration("user_id","ds0");
            tableRuleConfiguration1.setKeyGeneratorConfig(keyGeneratorConfiguration1);
            tableRuleConfiguration1.setTableShardingStrategyConfig(shardingStrategyConfiguration1);
            tableRuleConfiguration1.setDatabaseShardingStrategyConfig(shardingStrategyConfiguration2);
    
    
            //订单表配置
            //配置逻辑表和实际表分布情况,配置订单表分布情况
            TableRuleConfiguration tableRuleConfiguration2 = new TableRuleConfiguration("t_order","ds1.t_order");
            //生成主键策略
            KeyGeneratorConfiguration keyGeneratorConfiguration2 = new KeyGeneratorConfiguration("snowflake","order_id");
            //订单表的表和库路由配置,都是单库单表情况,相当于多数据源情况,库和表都是固定
            ShardingStrategyConfiguration shardingStrategyConfiguration3 = new InlineShardingStrategyConfiguration("order_id","t_order");
            ShardingStrategyConfiguration shardingStrategyConfiguration4 = new InlineShardingStrategyConfiguration("order_id","ds1");
            tableRuleConfiguration2.setKeyGeneratorConfig(keyGeneratorConfiguration2);
            tableRuleConfiguration2.setTableShardingStrategyConfig(shardingStrategyConfiguration3);
            tableRuleConfiguration2.setDatabaseShardingStrategyConfig(shardingStrategyConfiguration4);
    
            //实际表生成主键策略
            shardingRuleConfiguration.setTableRuleConfigs(Arrays.asList(tableRuleConfiguration1,tableRuleConfiguration2));
    
            return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfiguration, new Properties());
        }
    }
    
    
  • 垂直分库效果
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/109139316