springboot -- JDBC主从复制

版权声明:本文为博主原创文章,转载请说明出处。 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();
    }
}

 代码

猜你喜欢

转载自blog.csdn.net/weixin_43549578/article/details/84642330
今日推荐