sharding-jdbc vertical sub-database sub-table actual combat

  • Data
    sub-library sub-table concept and application scenarios Detailed
    sub-library sub-table brought some problems
    sharding-jdbc horizontal and vertical sub-library sub-table environment to build
    sharding-jdbc level sub-library sub-table real
    sharding-jdbc sub-library sub-table vertical combat

  • The purpose of vertical sub-database sub-table
    1. The split of the master-slave table structure also eases the index performance to a certain extent, and at the same time allows the master-slave table to operate concurrently without being restricted by row locks (vertical table sub-table)
    2. In the case of microservice architecture In order to better differentiate the business, the multi-schema mode is adopted, and different modules use different schemas (pseudo vertical sub-library)
    3.In the case of micro-service architecture, due to the very large business volume of some modules, the performance of the single library is reduced, which affects others Modules, usually separated into another library (true vertical sub-library)

  • The realization of
    vertical sub-tables, vertical sub-tables do not do experiments, we are doing vertical sub-tables every day, such as the structure of the master-slave table

  • Vertical sub-library realization

    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());
        }
    }
    
    
  • Vertical sub-library effect
    Insert picture description here
    Insert picture description here

Guess you like

Origin blog.csdn.net/weixin_38312719/article/details/109139316