一般情况下网站对数据库的读要比写多多了,所以当数据量大了的时候,使用读写分离是很有必要的
spring提供了数据源路由的类,正好拿它来实现一下
创建项目
简单的springboot项目,依赖有mybatis,mysql,aspect
springboot版本是 2.2.0.RELEASE
org.springframework.boot
spring-boot-starter
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.1
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-aop
数据
我测试的两个库,一个主库一个从库,只有一个表,数据如下
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- 主库的数据
INSERT INTO `user` (`id`, `username`)
VALUES
(1, 'tomoya'),
(2, '朋也');
-- 从库的数据
INSERT INTO `user` (`id`, `username`)
VALUES
(1, 'tomoya');
可以看到从库中少了一条数据,这样可以对比看读写分离的功能是否生效了
配置
首先就是springboot的双数据源的配置
application.yml
spring:
datasource:
master:
jdbc-url: jdbc:mysql://192.168.16.87:3306/pybbs?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123123
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
jdbc-url: jdbc:mysql://192.168.16.109:3306/pybbs?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123123
driver-class-name: com.mysql.cj.jdbc.Driver
使用java代码来创建两个数据源, 创建类 MyDataSource.java
@Configuration
public class MyDataSource {
// 主库数据源
@Bean
@ConfigurationProperties("spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
// 从库数据源
@Bean
@ConfigurationProperties("spring.datasource.slave")
public DataSource slaveDataSource() {
retu