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日

相关文章

  • Java深入理解代码块的使用细节

    Java 深入理解代码块的使用细节 代码块的定义 代码块是指被一对大括号包含起来的代码段,其中包括了定义变量、方法、循环、分支等语句。 Java中的代码块可以分为以下两种: 实例代码块 实例代码块是定义在类中的非静态代码块,可以用于初始化实例变量。实例代码块会在构造方法执行前执行。 实例代码块的示例代码如下: public class Demo { priv…

    Java 2023年5月20日
    00
  • JAVA及相关字符集编码问题研究分享

    JAVA及相关字符集编码问题研究分享 在Java编程中,字符集编码是一个重要的问题。本文将介绍Java的字符集编码问题,并分享一些实际应用中的示例。 什么是字符集编码 字符集编码是将字符转换为二进制数据的过程。在计算机中,所有数据都是以二进制格式存储的,因此字符集编码可以将字符转换为计算机可以处理的二进制数据。 Java中常用的字符集编码有UTF-8、GBK…

    Java 2023年5月20日
    00
  • JavaWeb开发之模仿知乎首页完整代码

    JavaWeb开发之模仿知乎首页完整代码的攻略大致可以分为以下步骤: 1. 学习HTML和CSS 在开始JavaWeb开发前,首先需要学习HTML和CSS等前端技术。HTML作为网站的骨架,负责网页结构的搭建,而CSS则负责网页的样式和布局。了解这些内容可以为后续的JavaWeb开发提供很好的基础。 2. 学习JavaWeb基础知识 JavaWeb开发需要涉…

    Java 2023年5月30日
    00
  • 使用CXF和Jersey框架来进行Java的WebService编程

    使用CXF和Jersey框架进行Java的WebService编程步骤如下: 配置pom.xml文件,添加CXF和Jersey框架相关的依赖。 “` org.apache.cxf cxf-bundle-jaxrs 3.3.6 org.glassfish.jersey.core jersey-server 2.30 org.glassfish.jersey.…

    Java 2023年5月31日
    00
  • 微信小程序中weui用法解析

    微信小程序中weui用法解析 什么是weui WeUI 是微信官方推出的一个基于Vue.js和Webpack构建的一套移动端UI组件库,适用于微信内网页开发和微信小程序开发。WeUI拥有丰富的UI组件,涉及常用的表单、列表、卡片、操作反馈等等。使用WeUI可以极大地提高小程序的开发效率和用户体验,帮助开发人员快速地开发出适应微信生态的小程序。 在微信小程序中…

    Java 2023年5月30日
    00
  • Java Runtime类详解_动力节点Java学院整理

    这里是针对“Java Runtime类详解_动力节点Java学院整理”的完整攻略。 什么是Java Runtime类? Java Runtime类是Java程序运行环境的一部分。它提供了许多重要的运行时方法,例如在程序运行时执行其他程序、获取JVM的空闲内存量、强制垃圾回收等。本身是一个单例类,通过获取 Runtime.getRuntime() 实例获得。 …

    Java 2023年5月20日
    00
  • Java中线程状态+线程安全问题+synchronized的用法详解

    下面是Java中线程状态、线程安全问题以及synchronized的用法详解,包含示例说明: Java中线程状态 Java中的线程状态主要有以下五种: 新建状态(New):线程对象被创建后,但还没有调用start()方法时,线程处于新建状态。 运行状态(Runnable):当线程对象调用start()方法后,线程就处于运行状态。在运行状态下,线程会不断地执行…

    Java 2023年5月19日
    00
  • jQuery中nextUntil()方法用法实例

    当你需要在 jQuery 中选取元素的时候,通过 nextUntil() 方法可以轻松地选取两个特定元素之间的所有元素。该方法返回元素集合对象。 语法 $(selector).nextUntil(stopSelector, filter) 参数: stopSelector:必选,元素的终止选择器,选取元素的末尾位置。 filter:可选,用于筛选元素的选择器…

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