前言:我們在單數(shù)據(jù)源的情況下,springboot配置是很簡單的,只需要導(dǎo)入相對應(yīng)的
包以及在配置文件配置連接參數(shù)即可。但是往往隨著業(yè)務(wù)的發(fā)展,我們通常會進(jìn)行數(shù)
據(jù)庫拆分以及比較老的系統(tǒng)需要集成時使用的數(shù)據(jù)庫不一樣,這個時候就需要配置多數(shù)據(jù)源的配置。參考網(wǎng)上各文章整理后配置好的多數(shù)據(jù)源。
一、項(xiàng)目依賴pom.xml配置
springboot版本為2.2.0,以下maven依賴包括sqlserver、mysql、jpa(按需求添加)
<!--sqlserver配置-->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<!--mysql配置-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jpa配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
二、application.yml配置文件配置
同時連接兩個數(shù)據(jù)庫,配置如下
server:
port: 8888
tomcat:
uri-encoding: utf-8
servlet:
context-path: /airQuality
session:
timeout: 30m
spring:
jpa:
database: MYSQL
show-sql: true
hibernate:
ddl-auto: update
second-dialect: org.hibernate.dialect.MySQL5Dialect
main-dialect: org.hibernate.dialect.SQLServer2008Dialect
datasource:
second:
# mysql數(shù)據(jù)源配置
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3006/bigdata_ecology_integrated_management?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
database: mysql
configuration:
maximum-pool-size: 30
dbcp2:
max-idle: 10
max-wait-millis: 10000
min-idle: 5
initial-size: 5
#sqlserver數(shù)據(jù)源配置
main:
url: jdbc:sqlserver://localhost:11433;DatabaseName=AQI
username: U_AQI
password: powerdata@2019
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
database: sql_server
configuration:
maximum-pool-size: 30
三、配置雙數(shù)據(jù)源主要代碼
1.創(chuàng)建主從數(shù)據(jù)源DataSourceConfig配置類
package com.eco.power.air.airquality.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
/**
* @author Wu Qilong
* @version 1.0
* @date 2019/11/12 14:43
* 配置主數(shù)據(jù)源
*/
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Primary
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "datasource.main")
public DataSource primaryDatasource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "datasource.second")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
2.主數(shù)據(jù)源的配置
package com.eco.power.air.airquality.config;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* @author Wu Qilong
* @version 1.0
* @date 2019/11/12 14:46
* 主數(shù)據(jù)源的配置
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",//配置連接工廠 entityManagerFactory
transactionManagerRef = "transactionManagerPrimary", //配置 事物管理器 transactionManager
basePackages = {"com.eco.power.air.airquality.repositoryPrimary"}//設(shè)置持久層所在位置
)
public class PrimaryConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("primaryDataSource")
// 自動注入配置好的數(shù)據(jù)源
private DataSource primaryDataSource;
@Value("${spring.jpa.hibernate.main-dialect}")
// 獲取對應(yīng)的數(shù)據(jù)庫方言
private String primaryDialect;
/**
*
* @param builder
* @return
*/
@Bean(name = "entityManagerFactoryPrimary")
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
return builder
//設(shè)置數(shù)據(jù)源
.dataSource(primaryDataSource)
//設(shè)置數(shù)據(jù)源屬性
.properties(getVendorProperties(primaryDataSource))
//設(shè)置實(shí)體類所在位置.掃描所有帶有 @Entity 注解的類
.packages("com.eco.power.air.airquality.entityPrimary")
// Spring會將EntityManagerFactory注入到Repository之中.有了 EntityManagerFactory之后,
// Repository就能用它來創(chuàng)建 EntityManager 了,然后 EntityManager 就可以針對數(shù)據(jù)庫執(zhí)行操作
.persistenceUnit("primaryPersistenceUnit")
.build();
}
private Map<String, String> getVendorProperties(DataSource dataSource) {
Map<String,String> map = new HashMap<>();
// 設(shè)置對應(yīng)的數(shù)據(jù)庫方言
map.put("hibernate.dialect",primaryDialect);
jpaProperties.setProperties(map);
return jpaProperties.getProperties();
}
/**
* 配置事物管理器
*
* @param builder
* @return
*/
@Bean(name = "transactionManagerPrimary")
@Primary
PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
3.從數(shù)據(jù)源的配置
package com.eco.power.air.airquality.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* @author Wu Qilong
* @version 1.0
* @date 2019/11/12 15:03
* 從數(shù)據(jù)源的配置
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactorySecondary",
transactionManagerRef="transactionManagerSecondary",
basePackages= { "com.eco.power.air.airquality.repositorySecondary" })
public class SecondaryConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Value("${spring.jpa.hibernate.second-dialect}")
private String secondaryDialect;
@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondaryDataSource)
.properties(getVendorProperties(secondaryDataSource))
.packages("com.eco.power.air.airquality.entitySecondary")
.persistenceUnit("secondaryPersistenceUnit")
.build();
}
private Map<String, String> getVendorProperties(DataSource dataSource) {
Map<String,String> map = new HashMap<>();
map.put("hibernate.dialect",secondaryDialect);
jpaProperties.setProperties(map);
return jpaProperties.getProperties();
}
@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
完成了以上配置之后,
主數(shù)據(jù)源的實(shí)體位于:com.eco.power.air.airquality.entityPrimary
主數(shù)據(jù)源的數(shù)據(jù)訪問對象位于:com.eco.power.air.airquality.repositoryPrimary
第二數(shù)據(jù)源的實(shí)體位于: com.eco.power.air.airquality.entitySecondary
第二數(shù)據(jù)源的數(shù)據(jù)訪問接口位于:com.eco.power.air.airquality.repositoryPrimary
分別在這些package下創(chuàng)建各自的實(shí)體和數(shù)據(jù)訪問接口!
至此多數(shù)據(jù)源配置完成,此方法也適用于其他數(shù)據(jù)庫配置,只需修改application.yml中的數(shù)據(jù)源配置即可。