springboot配置多数据源
概述
考虑到当项目发展壮大的时候,项目在数据库层面会遭遇瓶颈,因此想起了多数据源配置,并且实现主从数据库分离。下文将演示如何使用springboot进行多数据源配置。
项目框架
- SpringBoot
- Spring Data JPA
- MySQL
基本操作
配置数据库连接(application.properties)
在application.properties中进行如下配置
1 | spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver |
上面代码中前缀为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 实体如下所示
- com.shanyu.datasource.entity.slave.Admin 实体类
建立数据操作类(repository)
数据操作类分组也可以像entity下进行这样的分类,以便进行区分
- UserRepository接口
- AdminRepository接口
说明一下,使用SpringDataJpa之后,就可以直接通过继承JpaRepository接口实现基本的增删查改操作,同时因为只是接口,因此可以不用加@Repository这个注解,Spring容器就可以识别。当然也可以加。
配置主从数据源(config)
在SpringBoot项目中,通过注解@Configuration在一个类上,可对整个项目进行配置。
在图上可以知道,config文件夹下并不像entity和Repository下那样进行分层。可以同时对主数据库,从数据库进行配置。其中无论主数据库还是从数据库,都只需要配置一下三个东西。
- dataSource:数据源连接信息(上面配过了)
- entityManagerFactory:实体管理工厂
- transactionManager:事务管理
对主数据库配置
- 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本身支持多数据源配置。
对从数据库配置
配置从数据库跟配置主数据库基本一致。不同的是扫描application.properties中的前缀是spring.datasource.secondary,同时配置的Repository的路径和Entity的包路径也与主数据库配置不一样。
编写测试
编写Service层
编写测试类
总结
因为SpringBoot + SpringDataJPA对多数据源的支持,所以极大地简化了多数据源的配置,让开发配置越来越简单,开发配置成本越来越低。