使用 YAML 配置

引入 Maven 依赖

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>shardingsphere-jdbc-core</artifactId>
  4. <version>${shardingsphere.version}</version>
  5. </dependency>

规则配置

ShardingSphere-JDBC 的 YAML 配置文件 通过数据源集合、规则集合以及属性配置组成。 以下示例是根据 user_id 取模分库, 且根据 order_id 取模分表的 2 库 2 表的配置。

注:示例的数据库连接池为HikariCP,可根据业务场景更换为其他主流数据库连接池。

  1. # 配置真实数据源
  2. dataSources:
  3. # 配置第 1 个数据源
  4. ds0: !!com.zaxxer.hikari.HikariDataSource
  5. driverClassName: com.mysql.jdbc.Driver
  6. jdbcUrl: jdbc:mysql://localhost:3306/ds0
  7. username: root
  8. password:
  9. # 配置第 2 个数据源
  10. ds1: !!com.zaxxer.hikari.HikariDataSource
  11. driverClassName: com.mysql.jdbc.Driver
  12. jdbcUrl: jdbc:mysql://localhost:3306/ds1
  13. username: root
  14. password:
  15. rules:
  16. # 配置分片规则
  17. - !SHARDING
  18. tables:
  19. # 配置 t_order 表规则
  20. t_order:
  21. actualDataNodes: ds${0..1}.t_order${0..1}
  22. # 配置分库策略
  23. databaseStrategy:
  24. standard:
  25. shardingColumn: user_id
  26. shardingAlgorithmName: database_inline
  27. # 配置分表策略
  28. tableStrategy:
  29. standard:
  30. shardingColumn: order_id
  31. shardingAlgorithmName: table_inline
  32. t_order_item:
  33. # 省略配置 t_order_item 表规则...
  34. # ...
  35. # 配置分片算法
  36. shardingAlgorithms:
  37. database_inline:
  38. type: INLINE
  39. props:
  40. algorithm-expression: ds${user_id % 2}
  41. table_inline:
  42. type: INLINE
  43. props:
  44. algorithm-expression: t_order_${order_id % 2}
  1. // 创建 ShardingSphereDataSource
  2. DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(yamlFile);

使用 ShardingSphereDataSource

通过 YamlShardingSphereDataSourceFactory 工厂创建的 ShardingSphereDataSource 实现自 JDBC 的标准接口 DataSource。 可通过 DataSource 选择使用原生 JDBC,或JPA, MyBatis 等 ORM 框架。

  1. DataSource dataSource = YamlShardingSphereDataSourceFactory.createDataSource(yamlFile);
  2. String sql = "SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.user_id=? AND o.order_id=?";
  3. try (
  4. Connection conn = dataSource.getConnection();
  5. PreparedStatement ps = conn.prepareStatement(sql)) {
  6. ps.setInt(1, 10);
  7. ps.setInt(2, 1000);
  8. try (ResultSet rs = preparedStatement.executeQuery()) {
  9. while(rs.next()) {
  10. // ...
  11. }
  12. }
  13. }