springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)

下面我将详细讲解“springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)”的完整攻略。

什么是dynamic-datasource-spring-boot-starter

dynamic-datasource-spring-boot-starter(以下简称DDSS)是一款基于Spring Boot的多数据源管理框架,它也是一个Spring Boot的starter,能够自动化地配置多数据源,并支持在代码中切换数据源。

如何使用dynamic-datasource-spring-boot-starter

下面,我将简单介绍如何使用dynamic-datasource-spring-boot-starter。

首先,在pom.xml文件中引入以下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>2.7.0</version>
</dependency>

引入依赖之后,我们需要在application.yml或application.properties文件中进行如下配置:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root

这里我们配置了三个数据源,一个主数据源和两个从数据源。

接着,在项目的代码中,可以通过以下方式动态切换数据源:

@Service
public class UserServiceImpl implements UserService {

    /**
     * 多数据源注入
     *
     * @return
     */
    @Autowired
    private DataSource dataSource;

    /**
     * 注入JdbcTemplate
     *
     * @return
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User getUserById(Long id) {

        //获取主数据源
        DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.MASTER);
        String sql = "SELECT * FROM user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 查询所有用户
     *
     * @return
     */
    @Override
    public List<User> getAllUser() {

        //获取从数据源1
        DynamicDataSourceContextHolder.setDataSourceKey("slave1");
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 根据用户名和密码查询用户
     *
     * @param userName
     * @param password
     * @return
     */
    @Override
    public User getUserByUserNameAndPassword(String userName, String password) {

        //获取从数据源2
        DynamicDataSourceContextHolder.setDataSourceKey("slave2");
        String sql = "SELECT * FROM user WHERE user_name = ? and password = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userName, password}, new BeanPropertyRowMapper<>(User.class));
    }
}

这里我们通过使用DynamicDataSourceContextHolder.setDataSourceKey()方法,动态切换数据源。

dynamic-datasource-spring-boot-starter的示例

下面,我将给出两个dynamic-datasource-spring-boot-starter的示例。

示例一

在此示例中,我们首先需要在application.yml或application.properties文件中进行如下配置:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root

然后,在项目的代码中,通过以下方式动态切换数据源:

@Service
public class UserServiceImpl implements UserService {

    /**
     * 多数据源注入
     *
     * @return
     */
    @Autowired
    private DataSource dataSource;

    /**
     * 注入JdbcTemplate
     *
     * @return
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User getUserById(Long id) {

        //获取主数据源
        DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.MASTER);
        String sql = "SELECT * FROM user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 查询所有用户
     *
     * @return
     */
    @Override
    public List<User> getAllUser() {

        //获取从数据源1
        DynamicDataSourceContextHolder.setDataSourceKey("slave1");
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 根据用户名和密码查询用户
     *
     * @param userName
     * @param password
     * @return
     */
    @Override
    public User getUserByUserNameAndPassword(String userName, String password) {

        //获取从数据源2
        DynamicDataSourceContextHolder.setDataSourceKey("slave2");
        String sql = "SELECT * FROM user WHERE user_name = ? and password = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userName, password}, new BeanPropertyRowMapper<>(User.class));
    }
}

示例二

在此示例中,我们使用dynamic-datasource-spring-boot-starter来实现读写分离。

首先,我们需要在application.yml或application.properties文件中进行如下配置:

spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
        slave2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
          username: root
          password: root
  shardingsphere:
    ds:
      primary:
        url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      replica1:
        url: jdbc:mysql://localhost:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
      replica2:
        url: jdbc:mysql://localhost:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
    masterslave:
      name: ms
      load-balance-algorithm-type: round_robin
      master-data-source-name: primary
      slave-data-source-names: replica1, replica2
      slave-data-source-selector: com.baomidou.dynamic.datasource.spring.boot.autoconfigure.master_slave.RandomSlaveDataSourceSelector

这里我们配置了一个主数据源和两个从数据源,并使用了ShardingSphere实现了读写分离。

然后,在项目的代码中,通过以下方式动态切换数据源:

@Service
public class UserServiceImpl implements UserService {

    /**
     * 多数据源注入
     *
     * @return
     */
    @Autowired
    private DataSource dataSource;

    /**
     * 注入JdbcTemplate
     *
     * @return
     */
    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     * 根据id查询用户
     *
     * @param id
     * @return
     */
    @Override
    public User getUserById(Long id) {

        //获取主数据源
        DynamicDataSourceContextHolder.setDataSourceKey(DynamicDataSourceContextHolder.MASTER);
        String sql = "SELECT * FROM user WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 查询所有用户
     *
     * @return
     */
    @Override
    public List<User> getAllUser() {
        RandomSlaveDataSourceSelector.setSlaveIndex(new Random().nextInt(2));
        DynamicDataSourceContextHolder.setDataSourceKey("ms");
        String sql = "SELECT * FROM user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    /**
     * 根据用户名和密码查询用户
     *
     * @param userName
     * @param password
     * @return
     */
    @Override
    public User getUserByUserNameAndPassword(String userName, String password) {

        RandomSlaveDataSourceSelector.setSlaveIndex(new Random().nextInt(2));
        DynamicDataSourceContextHolder.setDataSourceKey("ms");
        String sql = "SELECT * FROM user WHERE user_name = ? and password = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{userName, password}, new BeanPropertyRowMapper<>(User.class));
    }
}

这里我们通过使用DynamicDataSourceContextHolder.setDataSourceKey()方法和RandomSlaveDataSourceSelector实现了对数据源的动态切换。需要注意的是,在读写分离的场景下,需要使用ShardingSphere的配置方式来实现数据源的切换。

以上就是关于“springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter)”的完整攻略和两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot配置多数据源的一款框架(dynamic-datasource-spring-boot-starter) - Python技术站

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

相关文章

  • 微信小程序实现列表页的点赞和取消点赞功能

    下面是实现微信小程序列表页点赞和取消点赞的攻略。该攻略将分为以下几个步骤: 前置准备 列表页数据的绑定和渲染 点赞和取消点赞功能的实现 点赞和取消点赞功能的联动 示例说明 前置准备 在开始实现之前,你需要先了解微信小程序的基本知识,并且在微信开发者工具中创建一个小程序项目。你还需要准备一个与列表页数据相关的接口,用于获取列表页数据、点赞和取消点赞等操作。 列…

    Java 2023年5月30日
    00
  • 批量上传Jar包到Maven私服的工具的方法

    下面是批量上传Jar包到Maven私服的工具的方法的完整攻略: 前置条件 确保已安装好Maven、Java和Git; 确保已创建好Maven私服; 确保已准备好需要上传的Jar包文件。 步骤一:克隆工具项目 使用Git命令或者在GitHub上下载项目源代码,并解压至本地。 git clone https://github.com/lilicoding/mav…

    Java 2023年5月20日
    00
  • SpringSessionRedis配置及发现的问题讲解

    下面是“SpringSessionRedis配置及发现的问题讲解”的完整攻略。 什么是SpringSessionRedis SpringSessionRedis是一个为Spring应用程序提供分布式会话管理的解决方案。它使用Redis来存储会话信息,从而实现了集群环境下的会话管理。 使用SpringSessionRedis,只需要在Spring应用程序中添加…

    Java 2023年5月20日
    00
  • 闲言碎语-逐步了解Spring

    当我们开始学习 Spring 的时候,我们经常会被各种概念和组件迷惑。为了逐步了解 Spring,以下是一些基本步骤: 1. 了解Spring的核心概念 在学习 Spring 之前,需要先了解 Spring 的基础概念。以下是一些常见的 Spring 核心概念: 依赖注入(Dependency Injection,DI) 依赖注入是 Spring 框架的核心…

    Java 2023年5月19日
    00
  • JSP转发和重定向的区别分析

    JSP转发和重定向都是在服务器端进行的页面跳转操作,但是它们有很大的区别。 JSP转发和重定向的区别 1. 请求的处理方式 JSP转发是在服务器端进行请求的处理和转发,客户端的请求URL不会发生改变。服务器会将请求转发给目标页面进行处理。 重定向是通过服务器向客户端返回指定的跳转地址,客户端通过重定向,再重新向服务器发起请求。这时客户端的请求URL会发生改变…

    Java 2023年6月15日
    00
  • Uploadify上传文件方法

    关于“Uploadify上传文件方法”,以下是完整的攻略: Uploadify上传文件方法 简介 Uploadify 是一个基于jQuery的文件上传组件,可以方便地实现文件的异步上传,支持多文件上传、队列顺序控制、进度条等功能。使用 Uploadify,可以很方便地在网页中实现文件上传功能。 使用步骤 1. 引入相关文件 在 HTML 页面中引入相关的文件…

    Java 2023年5月20日
    00
  • Java的作业调度类库Quartz基本使用指南

    Java的作业调度类库Quartz基本使用指南 Quartz是一个开源的作业调度框架,可以用来进行周期性任务、延时任务和基于时间的任务等的调度。本文将介绍Quartz的基本使用指南。 安装与配置 Quartz的安装与配置非常简单,在项目的依赖中添加以下Maven坐标: <dependency> <groupId>org.quartz-…

    Java 2023年6月1日
    00
  • 详解springboot项目带Tomcat和不带Tomcat的两种打包方式

    下面是关于“详解Spring Boot项目带Tomcat和不带Tomcat的两种打包方式”的完整攻略。 1. 带Tomcat的打包方式 1.1. 导入Tomcat依赖 首先,在你的Spring Boot项目中,需要导入Tomcat的依赖。具体来说,需要在pom.xml文件中添加如下代码: <dependency> <groupId>o…

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