在大型应用程序中,配置主从数据库并使用读写分离是常见的设计模式。
在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);