分库分表实现有两种实现方式:代码;配置文件。

    2019-11-06_073007.png

    1、应用代码方式实现分库分表

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.0.4.RELEASE</version>
    5. <relativePath />
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-web</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.springframework.boot</groupId>
    14. <artifactId>spring-boot-starter-data-jpa</artifactId>
    15. </dependency>
    16. <dependency>
    17. <groupId>mysql</groupId>
    18. <artifactId>mysql-connector-java</artifactId>
    19. </dependency>
    20. <dependency>
    21. <groupId>io.shardingsphere</groupId>
    22. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    23. <version>3.0.0.M3</version>
    24. </dependency>
    25. <dependency>
    26. <groupId>com.alibaba</groupId>
    27. <artifactId>druid</artifactId>
    28. <version>1.1.9</version>
    29. </dependency>
    30. <dependency>
    31. <groupId>org.springframework.boot</groupId>
    32. <artifactId>spring-boot-starter-test</artifactId>
    33. </dependency>
    34. </dependencies>
    35. <build>
    36. <plugins>
    37. <plugin>
    38. <groupId>org.springframework.boot</groupId>
    39. <artifactId>spring-boot-maven-plugin</artifactId>
    40. </plugin>
    41. </plugins>
    42. </build>
    1. ###数据库访问连接
    2. spring:
    3. jdbc:
    4. db0:
    5. password: root
    6. className: com.mysql.jdbc.Driver
    7. url: jdbc:mysql://localhost:3306/%s?characterEncoding=utf-8
    8. username: root
    9. jpa:
    10. database: mysql
    11. show-sql: true
    12. hibernate:
    13. ## 自己建表
    14. ddl-auto: none
    15. application:
    16. name: sharding-jdbc-first

    配置分表算法

    1. package com.mayikt.config;
    2. import java.util.Collection;
    3. import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
    4. import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;
    5. public class TableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Long> {
    6. // sql 中关键字 匹配符为 =的时候,表的路由函数
    7. public String doEqualSharding(Collection<String> availableTargetNames, ShardingValue<Long> shardingValue) {
    8. // availableTargetNames 分表的集合 t_order_0 和t_order_1
    9. for (String tableName : availableTargetNames) {
    10. // shardingValue.getValue() userid 分片字段值
    11. // tableName = t_order_0 shardingValue.getValue()=2
    12. // t_order_0 2%2=0
    13. if (tableName.endsWith(shardingValue.getValue() % 2 + "")) {
    14. return tableName;
    15. }
    16. }
    17. throw new IllegalArgumentException();
    18. }
    19. @Override
    20. public Collection<String> doInSharding(Collection<String> availableTargetNames, ShardingValue<Long> shardingValue) {
    21. return null;
    22. }
    23. @Override
    24. public Collection<String> doBetweenSharding(Collection<String> availableTargetNames,
    25. ShardingValue<Long> shardingValue) {
    26. return null;
    27. }
    28. }

    配置分库算法

    1. package com.mayikt.config;
    2. import java.util.Collection;
    3. import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;
    4. import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm;
    5. // 分库策略配置
    6. public class DatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm<Long> {
    7. // 考虑表的数据存放在那个库里面
    8. @Override
    9. public String doEqualSharding(Collection<String> databases, ShardingValue<Long> shardingValue) {
    10. for (String databaseName : databases) {
    11. if (databaseName.endsWith(shardingValue.getValue() % 2 + "")) {
    12. return databaseName;
    13. }
    14. }
    15. throw new IllegalArgumentException();
    16. }
    17. @Override
    18. public Collection<String> doInSharding(Collection<String> availableTargetNames, ShardingValue<Long> shardingValue) {
    19. return null;
    20. }
    21. @Override
    22. public Collection<String> doBetweenSharding(Collection<String> availableTargetNames,
    23. ShardingValue<Long> shardingValue) {
    24. return null;
    25. }
    26. }

    数据源整合分库分表算法

    1. package com.mayikt.config;
    2. import java.util.Arrays;
    3. import java.util.HashMap;
    4. import java.util.Map;
    5. import javax.sql.DataSource;
    6. import org.springframework.beans.factory.annotation.Value;
    7. import org.springframework.context.annotation.Bean;
    8. import org.springframework.context.annotation.Configuration;
    9. import com.alibaba.druid.pool.DruidDataSource;
    10. import com.dangdang.ddframe.rdb.sharding.api.ShardingDataSourceFactory;
    11. import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule;
    12. import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
    13. import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;
    14. import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy;
    15. import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy;
    16. import com.dangdang.ddframe.rdb.sharding.id.generator.IdGenerator;
    17. import com.dangdang.ddframe.rdb.sharding.id.generator.self.CommonSelfIdGenerator;
    18. // 数据源相关配置信息
    19. @Configuration
    20. public class DataSourceConfig {
    21. @Value("${spring.jdbc.db0.className}")
    22. private String className;
    23. @Value("${spring.jdbc.db0.url}")
    24. private String url;
    25. @Value("${spring.jdbc.db0.username}")
    26. private String username;
    27. @Value("${spring.jdbc.db0.password}")
    28. private String password;
    29. // 配置自动增长的策略
    30. @Bean
    31. public IdGenerator getIdGenerator() {
    32. return new CommonSelfIdGenerator();
    33. }
    34. // 创建数据源
    35. @Bean
    36. public DataSource getDataSource() {
    37. return buildDataSource();
    38. }
    39. private DataSource buildDataSource() {
    40. // 1.设置分库映射
    41. Map<String, DataSource> dataSourceMap = new HashMap<>(2);
    42. dataSourceMap.put("ds_0", createDataSource("ds_0"));
    43. dataSourceMap.put("ds_1", createDataSource("ds_1"));
    44. // 设置默认db为ds_0,也就是为那些没有配置分库分表策略的指定的默认库
    45. // 如果只有一个库,也就是不需要分库的话,map里只放一个映射就行了,只有一个库时不需要指定默认库,
    46. // 但2个及以上时必须指定默认库,否则那些没有配置策略的表将无法操作数据
    47. DataSourceRule rule = new DataSourceRule(dataSourceMap, "ds_0");
    48. // 2.设置分表映射,将t_order_0和t_order_1两个实际的表映射到t_order逻辑表
    49. TableRule orderTableRule = TableRule.builder("t_order")
    50. .actualTables(Arrays.asList("t_order_0", "t_order_1"))
    51. .dataSourceRule(rule).build();
    52. // 3.具体的分库分表策略
    53. ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(rule)
    54. .tableRules(Arrays.asList(orderTableRule))
    55. .databaseShardingStrategy(new DatabaseShardingStrategy("user_id", new DatabaseShardingAlgorithm()))
    56. .tableShardingStrategy(new TableShardingStrategy("order_id", new TableShardingAlgorithm()))
    57. .build();
    58. // 创建数据源
    59. DataSource dataSource = ShardingDataSourceFactory.createDataSource(shardingRule);
    60. return dataSource;
    61. }
    62. private DataSource createDataSource(String dataSourceName) {
    63. // 使用druid连接数据库
    64. DruidDataSource druidDataSource = new DruidDataSource();
    65. druidDataSource.setDriverClassName(className);
    66. druidDataSource.setUrl(String.format(url, dataSourceName));
    67. druidDataSource.setUsername(username);
    68. druidDataSource.setPassword(password);
    69. return druidDataSource;
    70. }
    71. }

    2、配置文件方式

    1. spring:
    2. jpa:
    3. show-sql: true
    4. hibernate:
    5. ddl-auto: none
    6. database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    7. sharding:
    8. jdbc:
    9. ####ds1
    10. datasource:
    11. names: ds1
    12. ds1:
    13. password: root
    14. type: com.alibaba.druid.pool.DruidDataSource
    15. driver-class-name: com.mysql.jdbc.Driver
    16. url: jdbc:mysql://127.0.0.1:3306/ds_1
    17. username: root
    18. config:
    19. sharding:
    20. tables:
    21. t_order:
    22. table-strategy:
    23. inline:
    24. #### 根据userid 进行分片
    25. sharding-column: user_id
    26. algorithm-expression: ds_1.t_order_$->{user_id % 2}
    27. actual-data-nodes: ds1.t_order_$->{0..1}
    28. props:
    29. sql:
    30. ### 开启分片日志
    31. show: true

    https://blog.csdn.net/tianyaleixiaowu/article/details/70242971
    https://www.cnblogs.com/cw828/p/11684476.html

    MyCat执行原理分析与初始Sharding-Jdbc.pptxSharding-Jdbc分片集群分表分库.docx资料.zip