文档章节

Spring Boot 中如何配置多数据源(十四)

老虎是个蛋蛋
 老虎是个蛋蛋
发布于 2018/07/08 16:16
字数 962
阅读 1131
收藏 33

最近实在是太忙了,各种事情,导致停更了好久。最近在做系统的重构,因为新老系统数据库不一样,导致需要做多数据源的切换配置,此项目基于spring boot开发,一下也以spring boot为例,废话不多说,开始撸代码!!!

1、创建一个新springboot项目,引入相应的jar,pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.quick</groupId>
	<artifactId>quick-moredatasource</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>quick-moredatasource</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath/>
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.8</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.31</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.0</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>6.0.5</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.33</version>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.9</version>
			<optional>true</optional>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

2、编写数据源的配置参数,我们以两个数据源为例

spring:
  datasource:
    master:
      url: jdbc:mysql://127.0.0.1:3306/mytest0?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&useSSL=false
      username: root
      password: root
    slave:
      url: jdbc:mysql://127.0.0.1:3306/mytest1?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true&useSSL=false
      username: root
      password: root

3、编写数据源配置对象,MasterDataSourceConfig ,SlaveDataSourceConfig

@Configuration
@EnableConfigurationProperties
public class MasterDataSourceConfig {
    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource masterDataSource = new DruidDataSource();
        masterDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        masterDataSource.setTestWhileIdle(true);
        masterDataSource.setTestOnBorrow(false);
        masterDataSource.setTestOnReturn(false);
        masterDataSource.setMaxWait(15000);
        masterDataSource.setTimeBetweenEvictionRunsMillis(60000);
        masterDataSource.setPoolPreparedStatements(false);
        masterDataSource.setValidationQuery("select 1 ");
        masterDataSource.setInitialSize(20);
        masterDataSource.setMaxActive(80);
        return masterDataSource;
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "masterSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
@Configuration
@EnableConfigurationProperties
public class SlaveDataSourceConfig {
    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        DruidDataSource queryDataSource = new DruidDataSource();
        queryDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        queryDataSource.setTestWhileIdle(true);
        queryDataSource.setTestOnReturn(false);
        queryDataSource.setTestOnBorrow(false);
        queryDataSource.setMaxWait(15000);
        queryDataSource.setTimeBetweenEvictionRunsMillis(60000);
        queryDataSource.setPoolPreparedStatements(false);
        queryDataSource.setValidationQuery("select 1 ");
        queryDataSource.setMaxActive(80);
        queryDataSource.setInitialSize(20);
        return queryDataSource;
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

4、创建domain

@Data
public class Book {
    private Integer id;
    private String bookName;
    private String author;
    private String isbn;
}

5、编写mapper.xml

在resources文件夹下创建文件夹/mapper/master/

创建名为BookMasterMapper.xml的mapper文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Book">
    <sql id="Query_Column">
        id as id,
        book_name as bookName,
        author as author,
        isbn as isbn
    </sql>
    <insert id="save" parameterType="com.quick.domain.Book">
        insert into book (book_name, author,isbn)
        values (#{bookName,jdbcType=VARCHAR},
         #{author,jdbcType=VARCHAR},
        #{isbn,jdbcType=VARCHAR})
    </insert>
</mapper>

6、编写对应的mapper类

@Repository
public class BookMasterMapper {
    @Resource(name = "masterSqlSessionTemplate")
    private SqlSessionTemplate sqlClient;

    public long save(Book book) {
        return sqlClient.insert("Book.save",book);
    }
}
@Repository
public class BookSlaveMapper {
    @Resource(name = "slaveSqlSessionTemplate")
    private SqlSessionTemplate sqlClient;

    public long save(Book book) {
        return sqlClient.insert("Book.save",book);
    }
}

7、ok编写测试service

@Service
public class BookService {
    @Resource
    private BookMasterMapper bookMasterMapper;
    @Resource
    private BookSlaveMapper bookSlaveMapper;
    public void save(Book book){
        bookMasterMapper.save(book);
        bookSlaveMapper.save(book);
    }
}

注入不同数据源的mapper对象。

8、启动类编写

@SpringBootApplication(exclude = {MybatisAutoConfiguration.class})
public class AppStart {

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

此处需要去掉mybatis的自动配置

9、编写单元测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class QuickMoredatasourceApplicationTests {
	@Resource
	private BookService bookService;
	@Test
	public void contextLoads() {
		Book book = new Book();
		book.setAuthor("wang");
		book.setBookName("boot");
		book.setIsbn("1122");
		bookService.save(book);
	}
}

10、执行完成看一下数据库数据

ok数据存入完成!!!

源码地址:https://gitee.com/wangGet/spring-boot-quick/tree/master/quick-moredatasource

© 著作权归作者所有

老虎是个蛋蛋
粉丝 173
博文 31
码字总数 40085
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(4)

老虎是个蛋蛋
老虎是个蛋蛋 博主

引用来自“就像风”的评论

```
spring:
datasource:
url: jdbc:mysql:replication://192.168.31.233:3307,192.168.31.233:3308/?autoReconnect=true&useServerPrepStmts=true
```
楼主的方案太复杂了,mysql 默认就支持 ha,改下连接地址就行了。然后配合使用 `@Transaction` 注解中的 `readOnly` 属性就实现和你相同的功能了。
ok,谢谢,我抽个时间再搞一下
行走在赤道
行走在赤道
```
spring:
datasource:
url: jdbc:mysql:replication://192.168.31.233:3307,192.168.31.233:3308/?autoReconnect=true&useServerPrepStmts=true
```
楼主的方案太复杂了,mysql 默认就支持 ha,改下连接地址就行了。然后配合使用 `@Transaction` 注解中的 `readOnly` 属性就实现和你相同的功能了。
Shayla
Shayla
可以
我的阿登
我的阿登
掌声
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
Spring Boot 2.0配置druid

第一种方式: 1、引入相关的包,刚开始没引入log4j包,一直报错。 2、添加druid相关的属性配置,具体各属性的意思,可以找官网或百度上去搜。 运行即可。 第二种方式: 均源于阿里参考:htt...

sam_l
2018/08/03
972
0
Spring Boot中的Mongodb多数据源扩展

在日常工作中,我们通过Spring Data Mongodb来操作Mongodb数据库,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。 然后配置连接信息如下: 或者 spring-boot-starter-da...

尹吉欢
04/25
0
0
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
2018/05/28
0
0
Spring boot中mongodb的使用

mongodb的增删改查 Spring Boot对各种流行的数据源都进行了封装,当然也包括了mongodb,下面给大家介绍如何在spring boot中使用mongodb: 1、pom包配置 pom包里面添加spring-boot-starter-dat...

glen_xu
2018/06/11
249
0

没有更多内容

加载失败,请刷新页面

加载更多

elasticsearch查询20公里以内的数据并按距离升序排序data es写法

NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();BoolQueryBuilder boolQueryBuilder=new BoolQueryBuilder();//这暂wei加入业务查询条件 queryBuilder.withQue......

为何不可1995
14分钟前
1
0
superset在线pip部署

1、安装依赖sudo yum install gcc libffi-devel python-devel python-pip python-wheel openssl-devel libsasl2-devel openldap-devel报错:没有可用软件包 python-pip。没有可用软件包 ......

阿伦哥-
18分钟前
2
0
photoshop简单使用

PS基本操作与图片格式 photoshop工具 组成 菜单项 工具栏 辅助面板 图片格式 jpg png gif 注: psd photoshop CC链接: https://pan.baidu.com/s/1LVa5R_btSjczLBwskCZidQ 提取码:sc3v 快捷...

studywin
20分钟前
1
0
springboot 整合pageHelper

今天跟大家聊聊springboot整合pageHelp,首先pageHelper是一个缓存式分页,分页步骤如下: 1 pom文件添加依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelp......

gaofei123
21分钟前
3
0
《DNS攻击防范科普系列1》—你的DNS服务器真的安全么?

DNS服务器,即域名服务器,它作为域名和IP地址之间的桥梁,在互联网访问中,起到至关重要的作用。每一个互联网上的域名,背后都至少有一个对应的DNS。对于一个企业来说,如果你的DNS服务器因...

大涛学弟
22分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部