springboot配置多数据源

springboot配置多数据源

概述

考虑到当项目发展壮大的时候,项目在数据库层面会遭遇瓶颈,因此想起了多数据源配置,并且实现主从数据库分离。下文将演示如何使用springboot进行多数据源配置。

项目框架

  • SpringBoot
  • Spring Data JPA
  • MySQL

基本操作

配置数据库连接(application.properties)

在application.properties中进行如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.password=970329
spring.datasource.primary.username=root
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/shanpu

spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/time_designer
spring.datasource.secondary.password=970329
spring.datasource.secondary.username=root

spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

上面代码中前缀为spring.datasource.primary表示主数据库,前缀为spring.datasource.slave表示从数据库,而spring.jpa就是配置一下jpa这块的东西(基本配置)。上面配置的是基本的数据库连接,就像平时项目一样,对数据库的连接。(在此提醒不要太依赖IDEA的智能提醒)

值得注意的是,一般配置jdbc的url的时候,是使用spring.datasource.url = jdbc:mysql://localhost:3306/XXX这个配置,但是在配置多数据源的时候,使用spring.datasource.jdbc-url 。第二个比第一个不同之处在于:第一个是url,第二个是jdbc-url。如果不这样配置,会出现说jdbcUrl is required with driverClassName的异常。

建立实体类(entity)

这里提一下。测试中将建立两个实体类。一个是User类,一个是Admin类,其中User放在主数据库,Admin放在从数据库

项目分层结构:

项目结构

在项目目录中,我们可以看到在com.shanyu.datasource.entity的包下再分层,一个是primary,一个是slave,primary包下管理主数据库的实体,entity包下管理从数据库的实体。

  • com.shanyu.datasource.entity.primary.User 实体如下所示

User实体类

  • com.shanyu.datasource.entity.slave.Admin 实体类

Admin实体类

建立数据操作类(repository)

数据操作类分组也可以像entity下进行这样的分类,以便进行区分

  • UserRepository接口

UserRepository

  • AdminRepository接口

AdminRepository

说明一下,使用SpringDataJpa之后,就可以直接通过继承JpaRepository接口实现基本的增删查改操作,同时因为只是接口,因此可以不用加@Repository这个注解,Spring容器就可以识别。当然也可以加。

配置主从数据源(config)

在SpringBoot项目中,通过注解@Configuration在一个类上,可对整个项目进行配置。

config项目结构

在图上可以知道,config文件夹下并不像entity和Repository下那样进行分层。可以同时对主数据库,从数据库进行配置。其中无论主数据库还是从数据库,都只需要配置一下三个东西。

  • dataSource:数据源连接信息(上面配过了)
  • entityManagerFactory:实体管理工厂
  • transactionManager:事务管理

对主数据库配置

  • MasterDataConfig中配置。

MasterDataConfig

  • @Configuration:表明这是一个SpringBoot下的配置类
  • @EnableTransactionManagement:开启事务管理器。
  • @EnableJpaRepositories:用于Spring JPA的代码配置。
    • entityManagerFactoryRef:实体管理工厂引用名称,对应到@Bean注解对应方法
    • basePackages:用于配置扫描Repository所在的package及子package。即数据操作接口所在package
  • @ConfigurationProperties:对application.properties配置文件进行扫描
  • @Primary:表示在众多相同的Bean中,优先使用@Primary注解的Bean
  • @Qualifier:注入对应的Bean。

在主数据源配置类中,对application.properties中以spring.datasource.primary开头的配置进行扫描读取。并进行dataSource配置。注意Datasource是java.sql.Datasource

  • 对Datasouce进行配置

使用DatasourceBuilder进行配置,读取application.properties中以spring.datasource.primary的配置。

  • 对实体管理工厂进行配置

实体管理工厂方法中返回LocalContainerEntityManagerFactory。其中builder.packages中指定的是实体类所在的包路径,而builder.properties中使用jpaProperties配置HibernateSetting。在Springboot1.5x以前是使用Datasource作为形参注入到getHibernateSetting中去,而SpringBoot2.0之后就变成了HibernateSetting作为形参了,这是一个坑,很多博客还是停留在SpringBoot1.5x以前并没有进行更新。我也是从一些良心博主中找到的原文地址

  • 对事务管理器进行配置

就使用Jpa的事务管理器就行了,因为Jpa本身支持多数据源配置。

对从数据库配置

SlaveDataConfig

配置从数据库跟配置主数据库基本一致。不同的是扫描application.properties中的前缀是spring.datasource.secondary,同时配置的Repository的路径和Entity的包路径也与主数据库配置不一样。

编写测试

编写Service层

TestService

编写测试类

测试类

总结

因为SpringBoot + SpringDataJPA对多数据源的支持,所以极大地简化了多数据源的配置,让开发配置越来越简单,开发配置成本越来越低。

-------------本文结束感谢您的阅读-------------