Spring Boot Jpa多数据源配置

前言
随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,如:user一个库,business一个库。那么接下来我们就要考虑怎么去在spring boot中实现多个数据源的配置。

×××

实现
建表
首先是建表语句,我们要建立两个数据库,并各库内新建一张表
user表
mysql> use user
mysql> select * from user;
+----+-------+----------+
| id | name | password |
+----+-------+----------+
| 1 | 用户A | ** |
+----+-------+----------+
1 row in set
business表
mysql> use business
mysql> select * from business;
+----+-------+-------------+
| id | name | description |
+----+-------+-------------+
| 1 | 业务A | 业务A描述 |
+----+-------+-------------+
1 row in setbr/>接下来我们通过代码实现对两个库内的多张表进行查询。
配置
首先,创建一个Spring配置类,定义两个DataSource用来读取application.yml中的不同配置。本文中,我们user做为主数据源,主数据源配置为spring.datasource.user开头的配置,business数据源配置为spring.datasource.business开头的配置。
@Configuration
public class DataSourceConfig {br/>@Primary
@Bean(name = "userDataSource")br/>@Qualifier("userDataSource")
@ConfigurationProperties(prefix = "spring.datasource.user")
public DataSource userDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "businessDataSource")
br/>@Qualifier("businessDataSource")
@ConfigurationProperties(prefix = "spring.datasource.business")
public DataSource businessDataSource() {
return DataSourceBuilder.create().build();
}
}
对应的配置文件application.yml如下:
spring:
datasource:
user:
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/user
username: root
password: 123456
business:
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/business
username: root
password: 123456
br/>接下来我们对各数据源进行jpa的配置
主数据源User
@Configuration
@EnableTransactionManagement
br/>@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryUser",
transactionManagerRef = "transactionManagerUser",
//设置Repository所在位置
basePackages = {"com.ppc.spring.example.jpamultidatasource.repository.user"})
public class UserConfig {
br/>@Autowired
@Qualifier("userDataSource")
private DataSource userDataSource;
br/>@Autowired
private JpaProperties jpaProperties;
br/>@Autowired
private HibernateProperties hibernateProperties;
br/>@Primary
@Bean(name = "entityManagerUser")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryUser(builder).getObject().createEntityManager();
br/>}
@Primary
@Bean(name = "entityManagerFactoryUser")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryUser(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(userDataSource)
//设置entity所在位置
.packages("com.ppc.spring.example.jpamultidatasource.entity.user")
.persistenceUnit("userPersistenceUnit")
.properties(getVendorProperties())
.build();
}
private Map<String, Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
br/>}
@Primary
@Bean(name = "transactionManagerUser")
public PlatformTransactionManager transactionManagerUser(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryUser(builder).getObject());
br/>}
}
其他数据源business
@Configuration
@EnableTransactionManagement
br/>@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryBusiness",
transactionManagerRef = "transactionManagerBusiness",
//设置repository所在位置
basePackages = {"com.ppc.spring.example.jpamultidatasource.repository.business"})
public class BusinessConfig {
br/>@Autowired
@Qualifier("businessDataSource")
private DataSource businessDataSource;
br/>@Autowired
private JpaProperties jpaProperties;
br/>@Autowired
private HibernateProperties hibernateProperties;
@Bean(name = "entityManagerBusiness")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryBusiness(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactoryBusiness")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBusiness(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(businessDataSource)
.properties(getVendorProperties())
//设置实体类所在位置
.packages("com.ppc.spring.example.jpamultidatasource.entity.business")
.persistenceUnit("businessPersistenceUnit")
.build();
}
private Map<String, Object> getVendorProperties() {
return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
}
@Bean(name = "transactionManagerBusiness")
PlatformTransactionManager transactionManagerBusiness(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryBusiness(builder).getObject());
}
}
配置中需要注意以下几点:
Spring Boot 1.5.x
private Map<String, String> getVendorProperties() {
return jpaProperties.getHibernateProperties(userDataSource);
}
Spring Boot 2.0.x
private Map<String, Object> getVendorProperties() {
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
Spring Boot 2.1.0参见上文代码,引进了HibernateProperties。同时,在Spring Boot 2.1.0中默认的mysql-connector-java版本为8.0.13,连接低版本mysql配置上比较繁琐,建议在配置文件中手动指定相应版本,如本文中指定5.1.46这个版本。
runtimeOnly(‘mysql:mysql-connector-java:5.1.46‘)
repository、entity的所在位置,要和实际保存的位置一致。

主数据源的一些配置需要添加@Primary作为spring默认的首选项,其他数据源无需添加该注解。

通过查看相关源码我们看到Spring Boot中JpaProperties的代码一直在调整,这里我们将properties相关代码单独提取出作为一个单独的方法getVendorProperties展示版本间的区别。其中:br/>查询
完成了所有的配置,接下来我们就可以开始写个简单代码验证我们配置了
@RestController
@SpringBootApplication
public class JpaMultiDatasourceApplication {
br/>@Autowired
UserRepository userRepository;
br/>@Autowired
Busine***epository busine***epository;
public static void main(String[] args) {
SpringApplication.run(JpaMultiDatasourceApplication.class, args);
br/>}
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userRepository.findById(id).orElse(null);
br/>}
@GetMapping("/business/{id}")
public Business getBusiness(@PathVariable Long id) {
return busine***epository.findById(id).orElse(null);
}
}
我们对外暴露了两个接口,分别访问user表、business表确认可以正常获取数据。查询结果如下:
请求:
http://localhost:8080/user/1
结果:{"id":1,"name":"用户A","password":"**"}
请求:
http://localhost:8080/business/1
结果:{"id":1,"name":"业务A","description":"业务A描述"}
就此,我们双数据源的配置和验证工作就完成了。

原文地址:http://blog.51cto.com/14028890/2316092

时间: 2024-10-13 22:52:44

Spring Boot Jpa多数据源配置的相关文章

spring boot jpa 多数据源配置

在实际项目中往往会使用2个数据源,这个时候就需要做额外的配置了.下面的配置在2.0.1.RELEASE 测试通过 1.配置文件 配置两个数据源 spring.datasource.url=jdbc:mysql://localhost:13306/first?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password= sprin

Spring Boot Jpa 的使用

使用 Spring Boot Jpa 开发时,发现国内对 Spring Boot Jpa 全面介绍的文章比较少案例也比较零碎,因此写文章总结一下Spring Data JPA 参考指南! Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据.它的出现主要是为了简化现有的持久化开发工作和整合 ORM

jpa多数据源配置参考链接

jpa单数据源配置: http://doc.okbase.net/liuyitian/archive/109276.html jpa多数据源配置: http://www.blogjava.net/weir/archive/2015/01/08/422132.html jpa不在persistence.xml文件中配置每个Entity实体类的2中解决办法 http://www.cnblogs.com/taven/archive/2013/10/04/3351841.html spring+jpa两

Spring Boot JPA 连接数据库

本文将介绍如何在Spring Boot 工程中添加JPA作为持久化方式. 修改 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 修改为 spring-boot-starter-data-jpa 即可,当然数据库驱动包也是不可少的,如下: <!-- MYSQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-conne

spring boot项目自定义数据源,mybatisplus分页、逻辑删除无效解决方法

Spring Boot项目中数据源的配置可以通过两种方式实现: 1.application.yml或者application.properties配置 2.注入DataSource及SqlSessionFactory两个Bean 通过第二种方式配置数据源则按照MybatisPlus官方文档使用分页及逻辑删除插件会无效,解决思路是在初始化SqlSessionFactory将插件设置进去 /** * 逻辑删除插件 */ @Bean public GlobalConfig globalConfig()

[转] Druid简介(Spring Boot + Mybatis + Druid数据源【自己定制】)

Druid的简介Druid是一个非常优秀的数据库连接池.在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss DataSource. Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验. Druid是一个JDBC组件,它包括三个部分: 基于Filter-Chain模式的插件体系. DruidDataSource 高效可管理的数据库连接池. SQLParser Druid的功能兼容DBCPDruid提

Spring Boot 探索系列 - 自动化配置篇

26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging,Log4J, Log4J2 an

学记:为spring boot写一个自动配置

spring boot遵循"约定由于配置"的原则,使用annotation对一些常规的配置项做默认配置,减少或不使用xml配置,让你的项目快速运行起来.spring boot的神奇不是借助代码的生成来实现的,而是通过条件注解来实现的. 自动配置AutoConfiguration是实现spring boot的重要原理,理解AutoConfiguration的运行原理特别重要,自己写一个AutoConfiguration可以加深我们对spring boot的理解. 1.定义Type-saf

自建生成代码工具(暂支持Spring boot +JPA)(更新中)

我们努力的方向就是用更少的时间写出更高质量的代码,因此我们都需要借助一些工具来提高自己的开发效率.写代码有些年头了,慢慢的可以写一些东西来提高工作效率.主要会从Java后台和Android开始,暂时叫“Auto coding”,大家如果有更好的想法麻烦告诉我,谢谢. 1. 生成后台和管理端代码  往往我们做项目会先把表建好再进行编码,管理端有多相似的地方,所以通过表SQL利用AutoCoding所以大部分代码,再对部分部分地方手动调整就能先快速完成一个功能模块. Spring boot JPA