版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/weixin_43549578/article/details/84642330
在项目中,随着数据量的不断增加,数据库的压力逐渐上升,因而项目的整体架构也在不断改变,由单一架构到多应用架构,数据库从一个库逐渐的由多个数据库进行数据的查询和插入等操作,如mysql的主从复制。本章节就是为了适应mysql一主多从,说明如何在项目中配置多个数据库,主数据库用来读写,从数据库只用来读取数据。
项目结构:
1.sql
DROP DATABASE IF EXISTS user_master;
CREATE DATABASE user_master;
CREATE TABLE user_master.user(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age DOUBLE(10,2) NOT NULL DEFAULT 0
);
INSERT INTO user_master.user (name, age) VALUES('master', '1');
DROP DATABASE IF EXISTS user_slave_one;
CREATE DATABASE user_slave_one;
CREATE TABLE user_slave_one.user(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age DOUBLE(10,2) NOT NULL DEFAULT 0
);
INSERT INTO user_slave_one.user(name, age) VALUES('slaveOne', '1');
DROP DATABASE IF EXISTS user_slave_two;
CREATE DATABASE user_slave_two;
CREATE TABLE user_slave_two.user(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age DOUBLE(10,2) NOT NULL DEFAULT 0
);
INSERT INTO user_slave_two.user (name, age) VALUES('slaveTwo', '1');
DROP DATABASE IF EXISTS user_slave_three;
CREATE DATABASE user_slave_three;
CREATE TABLE user_slave_three.user(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age DOUBLE(10,2) NOT NULL DEFAULT 0
);
INSERT INTO user_slave_three.user (name, age) VALUES('slaveThree', '1');
配置多数据源:
@Bean("dynamicDataSource")
public DataSource dynamicDataSource() {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>(4);
dataSourceMap.put(DataSourceKey.master.name(), master());
dataSourceMap.put(DataSourceKey.slaveOne.name(), slaveOne());
dataSourceMap.put(DataSourceKey.slaveTwo.name(), slaveTwo());
dataSourceMap.put(DataSourceKey.slaveThree.name(), slaveThree());
dynamicRoutingDataSource.setDefaultTargetDataSource(master());
dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
DynamicDataSourceContextHolder.dataSourceKeys.addAll(dataSourceMap.keySet());
DynamicDataSourceContextHolder.slaveDataSourceKeys.addAll(dataSourceMap.keySet());
DynamicDataSourceContextHolder.slaveDataSourceKeys.remove(DataSourceKey.master.name());
return dynamicRoutingDataSource;
}
package com.msql.dynamicdatasource.configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 决定数据库使用的是哪一个数据库与jdbc挂钩
*/
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceKey();
}
}