沃梦达 / 编程技术 / 数据库 / 正文

SpringBoot集成Sharding Jdbc使用复合分片的实践

下面是SpringBoot集成Sharding Jdbc使用复合分片的实践攻略,分为以下几个步骤:

下面是SpringBoot集成Sharding Jdbc使用复合分片的实践攻略,分为以下几个步骤:

1. 引入Sharding Jdbc和依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>5.0.0-alpha2</version>
</dependency>

同时还需要引入Sharding的依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>5.0.0-alpha2</version>
</dependency>

2. 配置Sharding Jdbc数据源

在SpringBoot的application.yml中添加Sharding Jdbc的数据源配置,以MySQL+分库分表且使用复合分片策略为例:

spring:
  shardingsphere:
    datasource:
      names: ds0, ds1
      ds0:
        url: jdbc:mysql://localhost:3306/sharding_db_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
      ds1:
        url: jdbc:mysql://localhost:3306/sharding_db_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
        username: root
        password: root
        driver-class-name: com.mysql.cj.jdbc.Driver
    sharding:
      tables:
        order:
          actualDataNodes: ds$->{0..1}.order_${0..7}
          databaseStrategy:
            inline:
              shardingColumn: user_id
              algorithmExpression: ds$->{user_id % 2}
          tableStrategy:
            inline:
              shardingColumn: order_id
              algorithmExpression: order_${order_id % 8}

其中,ds0ds1分别是两个物理数据库实例的配置,sharding.tablesactualDataNodes表示真实数据节点,这里为了演示复合分片策略,设置为分库分表情况下的8张表(注意这里的$和->符号需要转义),databaseStrategytableStrategy即为该示例的复合分片策略。

3. 编写数据访问层代码

在DAO层中,只需要利用Sharding Jdbc提供的org.apache.shardingsphere.transaction.annotation.ShardingTransactionType注解来指定事务类型即可。

示例代码1:使用JdbcTemplate实现简单查询

@Repository
public class OrderDao {
    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public OrderDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * 根据用户ID和订单ID查询订单
     *
     * @param userId   用户ID
     * @param orderId  订单ID
     * @return         订单信息
     */
    @ShardingTransactionType(TransactionType.XA)
    public List<Map<String, Object>> findByUserIdAndOrderId(long userId, long orderId) {
        return jdbcTemplate.queryForList("SELECT * FROM `order` WHERE user_id = ? AND order_id = ?", userId, orderId);
    }
}

示例代码2:使用MyBatis实现插入数据

@Mapper
@Repository
public interface OrderMapper {

    /**
     * 新增订单
     *
     * @param order 订单信息
     * @return      影响行数
     */
    @ShardingTransactionType(TransactionType.XA)
    @Insert("INSERT INTO `order`(user_id, order_id, order_time, amount) VALUES(#{userId}, #{orderId}, #{orderTime}, #{amount})")
    int insertOrder(Order order);

}

4. 测试

编写测试类来测试Sharding Jdbc和复合分片是否正常工作。

示例代码3:测试查询数据

@SpringBootTest
class ShardingJdbcApplicationTests {

    @Autowired
    private OrderDao orderDao;

    @Test
    void testFindByUserIdAndOrderId() {
        List<Map<String, Object>> orderList = orderDao.findByUserIdAndOrderId(1L, 2L);
        assertNotNull(orderList);
        assertFalse(orderList.isEmpty());
    }

}

示例代码4:测试插入数据

@SpringBootTest
class ShardingJdbcApplicationTests {

    @Autowired
    private OrderMapper orderMapper;

    @Test
    void testInsertOrder() {
        long userId = 12L;
        Order order = new Order(userId, SnowflakeIdWorker.getInstance().nextId(), new Date(), BigDecimal.valueOf(100));
        int rows = orderMapper.insertOrder(order);
        assertEquals(1, rows);
    }

}

以上就是使用SpringBoot集成Sharding Jdbc实现复合分片策略的完整攻略,希望能对你有所帮助。

本文标题为:SpringBoot集成Sharding Jdbc使用复合分片的实践

基础教程推荐