跳至主要內容

SpringBoot-应用篇-多数据源操作数据库

holic-x...大约 4 分钟JAVA框架

SpringBoot-应用篇-多数据源操作数据库

构建环境

  • Mybatis-plus
  • Druid 数据库连接池
  • dynamic-datasource

数据表构建

​ 分别向两个数据库中创建相同的数据表user(或者根据不同的情况创建不同结构的数据表),并插入数据

# 分别向数据库db_test_01、db_test_02 创建数据表

-- ----------------------------
-- User 表结构
-- ----------------------------
CREATE TABLE `user`  (
  `user_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `user_name` varchar(30)  NOT NULL COMMENT '用户账号',
  `nick_name` varchar(30)  NOT NULL COMMENT '用户昵称',
  `email` varchar(50)  NULL DEFAULT '' COMMENT '用户邮箱',
  `password` varchar(100)  NULL DEFAULT '' COMMENT '密码',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 COMMENT = '用户信息表' ROW_FORMAT = Dynamic;



# 插入数据
-- ----------------------------
-- 数据库 db_test_01 插入记录
-- ----------------------------
INSERT INTO `user` VALUES (100, 'wangwu', '王五', 'wangwu@qq.com', '123456');
INSERT INTO `user` VALUES (101, 'zhaoliu', '赵六', 'zhaoliu@qq.com', '123456');

-- ----------------------------
-- 数据库 db_test_02 插入记录
-- ----------------------------
INSERT INTO `user` VALUES (100, 'zhangsan', '张三', 'zhangsan@qq.com', '123456');
INSERT INTO `user` VALUES (101, 'lisi', '李四', 'lisi@qq.com', '123456');

多数据源项目构建实例

1.项目构建

​ 构建springboot项目,整合mybatis-plus、druid、dynamic-datasource相关依赖,版本参考maven官方仓库open in new window

pom.xml

<dependencies>
   <!-- MySQL驱动程序 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>最新版本</version>
    </dependency>
  
    <!-- Mybatis Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>最新版本</version>
    </dependency>
  
   <!-- Druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>最新版本</version>
    </dependency>
    
    <!-- Dynamic Datasource -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>最新版本</version>
    </dependency>
</dependencies>

项目配置:application.yml

spring:
  #数据源配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver # MySQL连接驱动配置
    druid:   # druid 相关配置
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: helloworld
        login-password: 123456
    dynamic:
      druid:
        initial-size: 10  # 连接池初始大小
        max-active: 100   # 连接池最大连接数
        min-idle: 10      # 连接池最小空闲连接数
        max-wait: 60000   # 获取连接的最大等待时间,单位为毫秒
        pool-prepared-statements: true  # 是否缓存PreparedStatement,默认为true
        max-pool-prepared-statement-per-connection-size: 20  # 每个连接缓存Statement的最大数目
        time-between-eviction-runs-millis: 60000  # 连接回收器运行的时间间隔,单位为毫秒
        min-evictable-idle-time-millis: 300000  # 连接在池中最小空闲的时间,达到此值后将被移除,单位为毫秒
        test-while-idle: true   # 空闲连接检测是否可用,默认为true
        test-on-borrow: false   # 取连接时检测连接是否可用,默认为false
        test-on-return: false   # 还连接时检测连接是否可用,默认为false
        validationQuery: "select 1"  # 验证连接的SQL语句
        filters: stat,wall    # 连接过滤器,用于统计和防火墙功能
        stat:
          log-slow-sql: true     # 是否打印慢SQL日志
          slow-sql-millis: 1000  # 慢SQL的阈值时间,单位为毫秒
          merge-sql: false   # 是否合并SQL,默认为false
        wall:
          multi-statement-allow: true  # 是否允许一次执行多条语句,默认为true
      primary: test1 # 主数据源,在代码中不指定数据源时默认为该主数据源(取决于datasource的配置)
      datasource:
        test1: # 数据源配置 此处test1对应为db_test_01(test1可自定义名称,和对应的数据源配置关联绑定即可)
          url: jdbc:mysql://localhost:3306/db_test_01
          username: root
          password: 123456
        test2: # 数据源 (对应为db_test_02)
          url: jdbc:mysql://localhost:3306/db_test_02
          username: root
          password: 123456

2.编写测试样例

model 层

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("user")
public class User {

    @TableId("user_id")
    private Integer userId;

    @TableField("user_name")
    private String userName;

    @TableField("nick_name")
    private String nickName;

    @TableField("email")
    private String email;

    @TableField("password")
    private String password;

}

mapper 层

/**
 * UserMapper 定义数据库操作方法
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

}

service 层

public interface UserService extends IService<User> {

    // 从 指定的 test1 数据源获取数据
    public List<User> findAllByTest1();

    // 从 指定的 test2 数据源获取数据
    public List<User> findAllByTest2();

}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    @DS("test1") // 指定数据源为test1
    @Override
    public List<User> findAllByTest1() {
        return userMapper.selectList(null);
    }

    @DS("test2") // 指定数据源为test2
    @Override
    public List<User> findAllByTest2() {
        return userMapper.selectList(null);
    }
}

controller层

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    // 测试数据源1
    @GetMapping("/findAllByTest1")
    public String findAllByTest1() {
        List<User> userList = userService.findAllByTest1();
        log.info("userList:{}", JSONObject.toJSONString(userList));
        return "success";
    }

    // 测试数据源2
    @GetMapping("/findAllByTest2")
    public String findAllByTest2() {
        List<User> userList = userService.findAllByTest2();
        log.info("userList:{}", JSONObject.toJSONString(userList));
        return "success";
    }
}

​ 启动项目,查看启动日志确认动态数据源配置是否正常加载

image-20240812081508928

接口测试

访问:http://localhost:8080/api/user/findAllByTest1 确认检索返回的信息

访问:http://localhost:8080/api/user/findAllByTest2 确认检索返回的信息

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3