在大型应用程序中,配置主从数据库并使用读写分离是常见的设计模式。

在Spring应用程序中,要实现读写分离,最好不要对现有代码进行改动,而是在底层透明地支持。

这样,就需要我们再一个项目中,配置两个,乃至多个数据源。

今天,小编先来介绍一下自己配置动态多数据源的步骤

项目简介:

  编译器:IDEA

  JDK:1.8

  框架:Spring Boot 2.1.0.RELEASES  + Mybatis + Druid

一、配置数据库连接数据

因为项目使用的是Spring Boot 框架,该框架会自动配置数据源,自动从application.properties中读取数据源信息,如果没有配置,启动时会报错,因此我们再配置自定义的数据源的时候,需要禁掉数据源的自动配置。

但是小编在启动项目的时候,还是报错了,可是由于jdbcTemplate重复了,框架自动帮我们定义了一个jdbcTemplate,而小编自己又自定义了一个,因此,也要将这个自动配置禁止掉

启动类方法如下:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,JdbcTemplateAutoConfiguration.class})
@MapperScan(sqlSessionTemplateRef = "jdbcTemplate")
public class DynamicDatasourseApplication {

    public static void main(String[] args) {
        SpringApplication.run(DynamicDatasourseApplication.class, args);
    }
}

下面开始配置自定义的数据源。

新建jdbc.properties文件,配置数据库的连接,数据源1为写库,数据源2为读库

jdbc.driverClassName.db=com.mysql.jdbc.Driver
#主数据源
jdbc.w.url=jdbc:mysql://localhost:3306/learning?characterEncoding=UTF-8&&serverTimezone=UTC
jdbc.w.user=root
jdbc.w.password=123456
#从数据源
jdbc.r.url=jdbc:mysql://localhost:3306/slave?characterEncoding=UTF-8&&serverTimezone=UTC
jdbc.r.user=root
jdbc.r.password=123456
#连接池配置
druid.initialSize=2
druid.minIdle=30
druid.maxActive=80
druid.maxWait=60000
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.validationQuery=SELECT 'x'
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.poolPreparedStatements=true
druid.maxPoolPreparedStatementPerConnectionSize=20
druid.filters=wall,stat

建表语句:

#数据库learning
CREATE TABLE `a`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` int(11) NOT NULL,
  `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `psw` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `seq` int(11) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;


INSERT INTO `a` VALUES (1, 'zsan', 30, 'f', '123456', 3);
INSERT INTO `a` VALUES (2, 'lisi', 31, 'f', '123456', 5);
INSERT INTO `a` VALUES (3, 'wangwu', 32, 'm', '123456', 1);
INSERT INTO `a` VALUES (4, 'zhaoliu', 33, 'm', '123456', 4);
INSERT INTO `a` VALUES (5, 'baiqi', 34, 'm', '123456', 6);
INSERT INTO `a` VALUES (6, 'hongba', 35, 'f', '123456', 2);
INSERT INTO `a` VALUES (7, 'zhuyl', 30, 'f', '123456', 7);

#数据库slave
CREATE TABLE `b`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `age` int(11) NOT NULL,
  `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `psw` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `seq` int(11) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;


INSERT INTO `b` VALUES (1, 'szsan', 30, 'f', '123456', 3);
INSERT INTO `b` VALUES (2, 'slisi', 31, 'f', '123456', 5);
INSERT INTO `b` VALUES (3, 'swangwu', 32, 'm', '123456', 1);
INSERT INTO `b` VALUES (4, 'szhaoliu', 33, 'm', '123456', 4);
INSERT INTO `b` VALUES (5, 'sbaiqi', 34, 'm', '123456', 6);
INSERT INTO `b` VALUES (6, 'shongba', 35, 'f', '123456', 2);
INSERT INTO `b` VALUES (7, 'szhuyl', 30, 'f', '123456', 7);
建表语句

相关文章:

  • 2021-11-07
  • 2022-02-05
  • 2021-12-07
  • 2021-11-19
  • 2022-12-23
  • 2021-10-25
  • 2022-12-23
猜你喜欢
  • 2021-08-06
  • 2022-01-30
  • 2022-12-23
  • 2022-01-05
  • 2021-08-31
  • 2022-12-23
相关资源
相似解决方案