数据分片

    基于Java编码的规则配置

    1. Map<String, DataSource> dataSourceMap = new HashMap<>();
    2. // 配置第一个数据源
    3. BasicDataSource dataSource1 = new BasicDataSource();
    4. dataSource1.setDriverClassName("com.mysql.jdbc.Driver");
    5. dataSource1.setUrl("jdbc:mysql://localhost:3306/ds0");
    6. dataSource1.setUsername("root");
    7. dataSource1.setPassword("");
    8. dataSourceMap.put("ds0", dataSource1);
    9. // 配置第二个数据源
    10. BasicDataSource dataSource2 = new BasicDataSource();
    11. dataSource2.setDriverClassName("com.mysql.jdbc.Driver");
    12. dataSource2.setUrl("jdbc:mysql://localhost:3306/ds1");
    13. dataSource2.setUsername("root");
    14. dataSource2.setPassword("");
    15. dataSourceMap.put("ds1", dataSource2);
    16. // 配置Order表规则
    17. TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order","ds${0..1}.t_order${0..1}");
    18. // 配置分库 + 分表策略
    19. orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}"));
    20. orderTableRuleConfig.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("order_id", "t_order${order_id % 2}"));
    21. // 配置分片规则
    22. ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
    23. shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
    24. // 省略配置order_item表规则...
    25. // ...
    26. // 获取数据源对象
    27. DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new Properties());

    或通过Yaml方式配置,与以上配置等价:

    1. dataSources:
    2. ds0: !!org.apache.commons.dbcp.BasicDataSource
    3. driverClassName: com.mysql.jdbc.Driver
    4. url: jdbc:mysql://localhost:3306/ds0
    5. username: root
    6. ds1: !!org.apache.commons.dbcp.BasicDataSource
    7. driverClassName: com.mysql.jdbc.Driver
    8. url: jdbc:mysql://localhost:3306/ds1
    9. username: root
    10. password:
    11. shardingRule:
    12. tables:
    13. actualDataNodes: ds${0..1}.t_order${0..1}
    14. databaseStrategy:
    15. inline:
    16. shardingColumn: user_id
    17. algorithmExpression: ds${user_id % 2}
    18. tableStrategy:
    19. inline:
    20. shardingColumn: order_id
    21. algorithmExpression: t_order${order_id % 2}
    22. t_order_item:
    23. actualDataNodes: ds${0..1}.t_order_item${0..1}
    24. databaseStrategy:
    25. inline:
    26. shardingColumn: user_id
    27. algorithmExpression: ds${user_id % 2}
    28. tableStrategy:
    29. inline:
    30. shardingColumn: order_id
    31. algorithmExpression: t_order_item${order_id % 2}

    使用原生JDBC

    1. DataSource dataSource = YamlShardingDataSourceFactory.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 preparedStatement = conn.prepareStatement(sql)) {
    6. preparedStatement.setInt(1, 10);
    7. preparedStatement.setInt(2, 1001);
    8. try (ResultSet rs = preparedStatement.executeQuery()) {
    9. while(rs.next()) {
    10. System.out.println(rs.getInt(1));
    11. System.out.println(rs.getInt(2));
    12. }
    13. }
    14. }

    使用Spring

    1. <!-- for spring boot -->
    2. <dependency>
    3. <groupId>org.apache.shardingsphere</groupId>
    4. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    5. <version>${sharding-sphere.version}</version>
    6. </dependency>
    7. <!-- for spring namespace -->
    8. <dependency>
    9. <artifactId>sharding-jdbc-spring-namespace</artifactId>
    10. <version>${sharding-sphere.version}</version>
    11. </dependency>

    基于Spring boot的规则配置

    基于Spring boot + JNDI的规则配置

    如果您计划使用Spring boot + JNDI的方式,在应用容器(如Tomcat)中使用Sharding-JDBC时,可使用spring.shardingsphere.datasource.${datasourceName}.jndiName来代替数据源的一系列配置。 如:

    1. spring.shardingsphere.datasource.ds0.jndi-name=java:comp/env/jdbc/ds0
    2. spring.shardingsphere.datasource.ds1.jndi-name=jdbc/ds1
    3. spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
    4. spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
    5. spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order$->{0..1}
    6. spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
    7. spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order$->{order_id % 2}
    8. spring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds$->{0..1}.t_order_item$->{0..1}
    9. spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
    10. spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item$->{order_id % 2}
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:sharding="http://shardingsphere.apache.org/schema/shardingsphere/sharding"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://shardingsphere.apache.org/schema/shardingsphere/sharding
    8. http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding.xsd
    9. ">
    10. <bean id="ds0" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    11. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    12. <property name="url" value="jdbc:mysql://localhost:3306/ds0" />
    13. <property name="username" value="root" />
    14. <property name="password" value="" />
    15. </bean>
    16. <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    17. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    18. <property name="url" value="jdbc:mysql://localhost:3306/ds1" />
    19. <property name="username" value="root" />
    20. <property name="password" value="" />
    21. </bean>
    22. <sharding:inline-strategy id="databaseStrategy" sharding-column="user_id" algorithm-expression="ds$->{user_id % 2}" />
    23. <sharding:inline-strategy id="orderTableStrategy" sharding-column="order_id" algorithm-expression="t_order$->{order_id % 2}" />
    24. <sharding:inline-strategy id="orderItemTableStrategy" sharding-column="order_id" algorithm-expression="t_order_item$->{order_id % 2}" />
    25. <sharding:data-source id="shardingDataSource">
    26. <sharding:sharding-rule data-source-names="ds0,ds1">
    27. <sharding:table-rules>
    28. <sharding:table-rule logic-table="t_order" actual-data-nodes="ds$->{0..1}.t_order$->{0..1}" database-strategy-ref="databaseStrategy" table-strategy-ref="orderTableStrategy" />
    29. <sharding:table-rule logic-table="t_order_item" actual-data-nodes="ds$->{0..1}.t_order_item$->{0..1}" database-strategy-ref="databaseStrategy" table-strategy-ref="orderItemTableStrategy" />
    30. </sharding:table-rules>
    31. </sharding:sharding-rule>

    在Spring中使用DataSource

    规则配置包括数据源配置、表规则配置、分库策略和分表策略组成。这只是最简单的配置方式,实际使用可更加灵活,如:多分片键,分片策略直接和表规则配置绑定等。更多的详细配置请参考配置手册