sharding-jdbc sub-tabla de sub-base de datos horizontal combate real


  • Sub-biblioteca de datos Concepto y escenarios de aplicación de
    sub-biblioteca La sub-tabla detallada de la sub-biblioteca trajo algunos problemas
    entorno de sub-tabla de sub-biblioteca horizontal y vertical de
    sharding-jdbc para construir sub-tabla de sub-biblioteca de nivel de sharding-jdbc real
    sharding-jdbc sub-biblioteca sub-mesa de combate vertical

  • Subtabla horizontal de la base de datos Propósito
    1. Subtabla horizontal, aliviar el problema de rendimiento de una gran cantidad de datos en una sola tabla.
    2. Subbase de datos horizontal , aliviar el problema de rendimiento de un gran número de solicitudes simultáneas de una sola base de datos

  • Realización de la tabla de puntuación de nivel

    实现方案:将一张表的数据,根据某种算法,分摊到多表中
    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
        public static JdbcTemplate getJdbcTemplate( DataSource dataSource){
          
          
            JdbcTemplate jdbcTemplate = new JdbcTemplate();
            jdbcTemplate.setDataSource(dataSource);
            return jdbcTemplate;
        }
    
    	//创建数据源,这个数据源是sharding-jdbc级别的数据源
        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);
    
            // 配置表规则bean
            ShardingRuleConfiguration shardingRuleConfiguration=new ShardingRuleConfiguration();
    
            //配置逻辑表和实际表分布情况,$是一个变量,取值范围是[1,2],表都在一个数据源ds0
            TableRuleConfiguration tableRuleConfiguration = new TableRuleConfiguration("t_user","ds0.t_user_$->{1..2}");
    
            //实际表生成主键策略,分表用数据库自增会重复,必须用第三方生成的id
            KeyGeneratorConfiguration keyGeneratorConfiguration = new KeyGeneratorConfiguration("snowflake","user_id");
    
            //配置选择表的路由配置,当user_id是偶数数据存t_user_1中
            //配置选择表的路由配置,当user_id是奇数数据存t_user_2中
            ShardingStrategyConfiguration shardingStrategyConfiguration = new InlineShardingStrategyConfiguration("user_id","t_user_$->{user_id%2+1}");
            //配置选择库的路由配置,因为是分表,所以库是固定的
            ShardingStrategyConfiguration shardingStrategyConfiguration1 = new InlineShardingStrategyConfiguration("user_id","ds0");
    
            shardingRuleConfiguration.setTableRuleConfigs(Arrays.asList(tableRuleConfiguration));
            shardingRuleConfiguration.setDefaultKeyGeneratorConfig(keyGeneratorConfiguration);
            shardingRuleConfiguration.setDefaultTableShardingStrategyConfig(shardingStrategyConfiguration);
            shardingRuleConfiguration.setDefaultDatabaseShardingStrategyConfig(shardingStrategyConfiguration1);
    
            return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfiguration, new Properties());
        }
    }
    
  • Efecto de tabla de puntuación de nivel
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí

  • Realización de sub-biblioteca horizontal

    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);
            }
    
        }
    
    
        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");
            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");
            dataSource2.setUsername("root");
            dataSource2.setPassword("123456");
            dataSourceMap.put("ds1", dataSource2);
    
            // 配置表规则bean
            ShardingRuleConfiguration shardingRuleConfiguration=new ShardingRuleConfiguration();
    
            //配置逻辑表和实际表分布情况,两个t_user表分布在不同的数据库中
            TableRuleConfiguration tableRuleConfiguration = new TableRuleConfiguration("t_user","ds$->{0..1}.t_user");
    
            //实际表生成主键策略,分表用数据库自增会重复,必须用第三方生成的id
            KeyGeneratorConfiguration keyGeneratorConfiguration = new KeyGeneratorConfiguration("snowflake","user_id");
    
            //配置选择表的路由配置,这里我们分库了,表名称一样了
            ShardingStrategyConfiguration shardingStrategyConfiguration = new InlineShardingStrategyConfiguration("user_id","t_user");
    
    		//配置选择库的路由配置,当user_id是奇数,数据存在ds0数据库中
    		//配置选择库的路由配置,当user_id是偶数,数据存在ds1数据库中
            ShardingStrategyConfiguration shardingStrategyConfiguration1 = new InlineShardingStrategyConfiguration("user_id","ds$->{user_id%2}");
    
            shardingRuleConfiguration.setTableRuleConfigs(Arrays.asList(tableRuleConfiguration));
            shardingRuleConfiguration.setDefaultKeyGeneratorConfig(keyGeneratorConfiguration);
            shardingRuleConfiguration.setDefaultTableShardingStrategyConfig(shardingStrategyConfiguration);
            shardingRuleConfiguration.setDefaultDatabaseShardingStrategyConfig(shardingStrategyConfiguration1);
    
            return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfiguration, new Properties());
        }
    }
    
    
  • Efecto de sub-biblioteca horizontal
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_38312719/article/details/109138914
Recomendado
Clasificación