SpringBoot+ShardingSphereJDBC实现读写分离详情

下面是使用SpringBoot和ShardingSphereJDBC实现读写分离的详细攻略。

一、什么是ShardingSphereJDBC

ShardingSphereJDBC是一款分布式数据库中间件,它提供了分库分表、读写分离、分布式事务等功能,并与主流的ORM框架(如Spring JDBC,MyBatis,JPA等)深度集成,让应用开发者无需改变已有的应用代码即可使用ShardingSphereJDBC的各项功能。

二、使用SpringBoot和ShardingSphereJDBC实现读写分离的步骤

1、引入依赖

在pom.xml文件中引入ShardingSphereJDBC的相关依赖。以下是一个示例:

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

2、配置数据源

这里我们定义两个数据源:主库和从库。在application.yml文件中配置数据源,以下是一个示例:

spring:
  datasource:
    master:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: root
    slave:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/slave_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: root

3、配置分片规则

在application.yml文件中配置分片规则。我们这里以按照user_id分片为例子,以下是一个示例:

sharding:
  datasource:
    names: master,slave
    master:
      jdbc-url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: root
      connectionTimeoutMilliseconds: 30000
      idleTimeoutMilliseconds: 60000
      maxLifetimeMilliseconds: 1800000
      maxPoolSize: 50
      minPoolSize: 1
      maintenanceIntervalMilliseconds: 30000
      maxIdleTimeMilliseconds: 1800000
    slave:
      jdbc-url: jdbc:mysql://localhost:3306/slave_db?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: root
      connectionTimeoutMilliseconds: 30000
      idleTimeoutMilliseconds: 60000
      maxLifetimeMilliseconds: 1800000
      maxPoolSize: 50
      minPoolSize: 1
      maintenanceIntervalMilliseconds: 30000
      maxIdleTimeMilliseconds: 1800000
  sharding:
    tables:
      user:
        actualDataNodes: master.user, slave.user
        tableStrategy:
          inline:
            shardingColumn: user_id
            algorithmExpression: user_${user_id % 2}

4、使用ShardingDataSource配置数据源

最后在SpringBoot应用中使用ShardingDataSource来实现读写分离。以下是一个示例:

@Configuration
public class DataSourceConfig {

  @Autowired
  private DataSource masterDataSource;

  @Autowired
  private DataSource slaveDataSource;

  @Bean
  public DataSource shardingDataSource() throws SQLException {
    Map<String, DataSource> dataSourceMap = new HashMap<>(2);
    dataSourceMap.put("master", masterDataSource);
    dataSourceMap.put("slave", slaveDataSource);

    ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
    TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration("user", "master.user,slave.user");
    tableRuleConfig.setTableShardingStrategyConfig(
        new StandardShardingStrategyConfiguration("user_id", new InlineShardingAlgorithm() {
          @Override
          public String doSharding(final Collection<String> availableTargetNames, final ShardingValue shardingValue) {
            return "user_" + shardingValue.getValue().toString().hashCode() % 2;
          }
        }));
    shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);

    Properties properties = new Properties();
    properties.setProperty("sql.show", Boolean.TRUE.toString());

    return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, new ConcurrentHashMap<>(), properties);
  }

}

以上就是使用SpringBoot和ShardingSphereJDBC实现读写分离的全部过程。

三、示例

我们来看两个示例:

示例1:查询

以下代码演示了如何使用ShardingSphereJDBC和SpringBoot在读写分离情况下进行查询操作:

@Service
public class UserServiceImpl implements UserService {

  @Autowired
  private UserMapper userMapper;

  @Override
  public List<User> findByUserIdList(List<Long> userIdList) {
    List<User> userList = new ArrayList<>();
    userIdList.forEach(userId -> {
      userList.addAll(userMapper.findByUserId(userId));
    });
    return userList;
  }

}

其中UserMapper是一个标准的MyBatis Mapper,但是我们使用的是ShardingSphereJDBC提供的动态数据源代理对象,这样就可以自动路由到主库或从库。以下是一个示例:

@Mapper
public interface UserMapper {

  @Select("SELECT * FROM user WHERE user_id = #{userId}")
  List<User> findByUserId(@Param("userId") Long userId);

}

示例2:写入

以下代码演示了如何使用ShardingSphereJDBC和SpringBoot进行插入操作:

@Service
public class UserServiceImpl implements UserService {

  @Autowired
  private UserMapper userMapper;

  @Override
  public void save(User user) {
    userMapper.insert(user);
  }

}

同样,我们在Mapper中使用的是ShardingSphereJDBC提供的动态数据源代理对象,这样就可以自动路由到主库。以下是一个示例:

@Mapper
public interface UserMapper {

  @Insert("INSERT INTO user (user_id, user_name, password) VALUES (#{userId}, #{userName}, #{password})")
  void insert(User user);

}

以上两个示例均可以自动路由到主库或从库上进行数据操作。

这就是使用SpringBoot和ShardingSphereJDBC实现读写分离的攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot+ShardingSphereJDBC实现读写分离详情 - Python技术站

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

相关文章

  • JavaScript语法着色引擎(demo及打包文件下载)

    JavaScript语法着色引擎(Syntax Highlighting Engine for JavaScript)是一款优秀的用于高亮显示JavaScript代码的工具,可以帮助开发者更加清晰地阅读并理解代码。现在,我将为大家提供一份完整攻略,来帮助初学者快速上手使用这款工具。 安装 首先,我们需要将JavaScript语法着色引擎下载到本地或者项目中。…

    Java 2023年6月15日
    00
  • Java8使用LocalDate计算日期实例代码解析

    Java8使用LocalDate计算日期实例代码解析 简介 Java8中新增了一个日期时间API–java.time包,其中一个类LocalDate可以用来处理日期。在这个攻略中,我们将通过两个示例代码详细介绍如何使用LocalDate计算日期。 示例1:计算两个日期相差的天数 import java.time.LocalDate; import java…

    Java 2023年5月20日
    00
  • SpringBoot图文并茂详解如何引入mybatis与连接Mysql数据库

    下面详细讲解如何在Spring Boot项目中引入MyBatis并连接MySQL数据库。 一、前置条件 Java环境(Java 8及以上版本) Maven环境(Maven 3及以上版本) MySQL数据库 二、引入依赖 在项目的pom.xml文件中添加如下依赖: <dependencies> <!– Spring Boot依赖 –&gt…

    Java 2023年5月20日
    00
  • Java实时获取基金收益项目源码分享

    Java实时获取基金收益项目源码分享 本文介绍使用Java编写程序实时获取基金收益的方法。用户可以输入基金代码,程序会自动访问天天基金网站获取最新的基金收益数据,并实时展示在命令行窗口中。如果用户需要保存数据,程序还提供了将数据保存为CSV文件的功能。 准备工作 在开始编写Java程序之前,需要安装Java开发环境(JDK)以及Maven构建工具。 下载依赖…

    Java 2023年6月1日
    00
  • 面试官:Java中new Object()到底占用几个字节

    让我来详细讲解一下Java中new Object()到底占用几个字节。 Java中new Object()的内存分配 在Java中,每当使用new关键字创建一个新的对象时,JVM就会在堆(Heap)中为该对象分配内存空间。对于一个标准的Object对象,它占用的空间大小可以通过Java虚拟机规范中的定义进行推算。 根据Java虚拟机规范,每个对象的大小受到以…

    Java 2023年5月26日
    00
  • 深入浅析Centos 7系统的Tomcat服务器

    深入浅析Centos 7系统的Tomcat服务器 简介 Tomcat 是 Apache 软件基金会(Apache Software Foundation)的一款开源的 Java Servlet 容器,也是一个标准的 JSP 容器。 本文将分步讲解如何在 Centos 7 系统上安装和配置 Tomcat 服务器,以及如何在 Tomcat 中部署网站应用。 安装…

    Java 2023年5月19日
    00
  • 详解JAVA中的OPTIONAL

    详解JAVA中的Optional Java中的Optional是Java8中新增的类,用于解决空指针异常。Optional类通过包装对象的形式,判断对象是否为空,从而避免空指针异常。 Optional基本概念 Optional的创建 Optional的创建有两种方法:empty()和of(T value)。 当要创建一个空的Optional对象时,可以使用e…

    Java 2023年5月26日
    00
  • 解决SpringMvc中普通类注入Service为null的问题

    解决SpringMVC中普通类注入Service为null的问题 在 SpringMVC 中,我们经常会遇到普通类注入 Service 为 null 的问题。这是因为 SpringMVC 默认只会扫描带有 @Controller、@Service、@Repository、@Component 等注解的类,而普通类并不会被扫描到。本文将详细讲解如何解决这个问题…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部