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

yizhihongxing

下面是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使用复合分片的实践 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 如何在Python中使用SQLAlchemy操作PostgreSQL数据库?

    在Python中,我们可以使用SQLAlchemy库操作PostgreSQL数据库。SQLAlchemy是一个Python SQL工具包和ORM,它提供了一种抽象层,使得我们可以使用Python语言来操作各种关系型数据库。以下是如何在Python中使用SQLAlchemy操作PostgreSQL数据库的完整使用攻略,包括连接数据库、创建表、插入数据、查询数据…

    python 2023年5月12日
    00
  • php安装dblib扩展,连接mssql的具体步骤

    要安装dlib扩展和连接mssql,您可以按照以下步骤进行操作: 准备工作 首先,您需要确保已经安装并配置好了PHP和MSSQL Server。安装过程可以参考相关的教程和文档。 下载并安装FreeTDS FreeTDS是一个用于访问MSSQL、Sybase等数据库服务器的开源库。您可以从官网上下载最新版本的FreeTDS。安装过程可能会因系统环境的不同而有…

    database 2023年5月22日
    00
  • 人人都能看懂的 6 种限流实现方案(纯干货)

    人人都能看懂的 6 种限流实现方案(纯干货) 为什么要限流 限流是指对系统中的请求进行控制,限制流量到达一定的阈值,从而保护系统的可用性、稳定性和安全性。在高并发场景、恶意攻击、突发事件等情况下,未实现限流可能导致服务器崩溃、数据库宕机、带宽溢出等问题。因此,限流是保障系统稳定可靠的重要手段。 6 种限流实现方案 1. 固定窗口计数器算法 这是最基本的实现方…

    database 2023年5月22日
    00
  • Redis之key的淘汰策略

    淘汰策略概述 redis作为缓存使用时,在添加新数据的同时自动清理旧的数据。这种行为在开发者社区众所周知,也是流行的memcached系统的默认行为。 redis中使用的LRU淘汰算法是一种近似LRU的算法。 淘汰策略 针对淘汰策略,redis有一下几种配置方案: 1、noeviction:当触发内存阈值时,redis只读不写; 2、allkeys-lru:…

    Redis 2023年4月11日
    00
  • SQL案例学习之字符串的合并与拆分方法总结

    SQL案例学习之字符串的合并与拆分方法总结 在SQL查询中,字符串的合并和拆分是非常常见的操作,本篇文章将总结字符串合并和拆分的方法,希望对读者有所帮助。 字符串合并 在SQL查询中,我们需要将两个或多个字符串合并成一个字符串。这个操作在实际场景中非常常见,例如我们在拼接一条完整的地址时,需要将省份、城市、街道三个信息合并为一个字符串。 使用 CONCAT …

    database 2023年5月21日
    00
  • MySQL数据库远程连接开启方法

    MySQL数据库远程连接是一种常见的场景,在不同的业务场景中可能会用到。本文主要介绍如何开启MySQL数据库的远程连接,并提供两个示例说明。 准备工作 在开启MySQL数据库远程连接前,需要完成以下准备工作: 确认MySQL服务已经启动,并且网络访问可通。 确认有一个MySQL的可访问的用户,并具有相应的权限。 修改MySQL配置文件,开启远程访问权限。 修…

    database 2023年5月22日
    00
  • 如何保障mysql和redis之间的数据一致性

    在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。Redis缓存数据的加载可以分为懒加载和主动加载两种模式,下面分别介绍在这两种模式下的数据一致性如何处理。 懒加载 读取缓存步骤一般没有什么问题,但是一旦涉及到…

    Redis 2023年4月11日
    00
  • SQL – DELETE 语句

    下面是SQL-DELETE语句的详细攻略: 基本语法 SQL中DELETE语句用于从表中删除记录(行)。基本语法如下: DELETE FROM 表名 WHERE 条件; 其中,表名指定要删除记录的表名称,WHERE子句指定要满足的条件,只有满足条件的记录会被删除。如果不指定WHERE子句,则会删除表中所有记录。 实例一:删除指定条件的记录 假设有一个学生信息…

    database 2023年3月27日
    00
合作推广
合作推广
分享本页
返回顶部