SpringBoot2.0 配置多數(shù)據(jù)源

一订咸、簡述

配置多數(shù)據(jù)源意思就是在一個(gè)項(xiàng)目中使用多個(gè)數(shù)據(jù)庫超营,在項(xiàng)目使用中可以不用手動切換數(shù)據(jù)庫來實(shí)現(xiàn)不同數(shù)據(jù)庫的數(shù)據(jù)獲取和更新协屡。

源碼地址: https://github.com/hanguilin/boot-security

項(xiàng)目環(huán)境: SpringBoot 2.1.9宫蛆、Spring Data Jpa

項(xiàng)目文件夾:

二赊抖、配置

application.properties

  • spring.datasource.primary.driver-class-name 數(shù)據(jù)庫驅(qū)動包

  • spring.datasource.primary.jdbc-url 數(shù)據(jù)庫連接

  • spring.datasource.primary.username 用戶名

  • spring.datasource.primary.password 密碼

數(shù)據(jù)庫配置別名可自定義统倒,此處一級庫為primmary。二級數(shù)據(jù)庫配置同上熏迹,別名為secondary檐薯。

hikara為數(shù)據(jù)庫連接池的配置,同類產(chǎn)品還有druid注暗。

server.port=8080

##########一級數(shù)據(jù)庫配置##########
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/primary_db?autoReconnect=true&useUnicode=true&useSSL=false
spring.datasource.primary.username=root
spring.datasource.primary.password=****
#最大連接數(shù)
spring.datasource.primary.hikari.maximum-pool-size=20
#連接超時(shí)毫秒
spring.datasource.primary.hikari.connection-timeout=60000
#空閑的連接的生命時(shí)長毫秒
spring.datasource.primary.hikari.idle-timeout=60000
#連接的生命時(shí)長毫秒
spring.datasource.primary.hikari.max-lifetime=60000
#驗(yàn)證連接有效性毫秒
spring.datasource.primary.hikari.validation-timeout=3000
#登錄超時(shí)毫秒
spring.datasource.primary.hikari.login-timeout=5
##########一級數(shù)據(jù)庫配置##########

##########二級數(shù)據(jù)庫配置##########
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/secondary_db?autoReconnect=true&useUnicode=true
spring.datasource.secondary.username=root
spring.datasource.secondary.password=****
#最大連接數(shù)
spring.datasource.secondary.hikari.maximum-pool-size=20
#連接超時(shí)毫秒
spring.datasource.secondary.hikari.connection-timeout=60000
#空閑的連接的生命時(shí)長毫秒
spring.datasource.secondary.hikari.idle-timeout=60000
#連接的生命時(shí)長毫秒
spring.datasource.secondary.hikari.max-lifetime=60000
#驗(yàn)證連接有效性毫秒
spring.datasource.secondary.hikari.validation-timeout=3000
#登錄超時(shí)毫秒
spring.datasource.secondary.hikari.login-timeout=5
##########二級數(shù)據(jù)庫配置##########

##########hibernate配置##########
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
##########hibernate配置##########

DataSourcesConfig.java

  • @Bean(name = "primaryDataSource")

將該返回對象交由Spring管理,bean名稱為primaryDataSource墓猎。

  • @Qualifier("primaryDataSource")

根據(jù)名稱將bean注入到對象捆昏。

  • @Primary

自動裝配時(shí)當(dāng)出現(xiàn)多個(gè)Bean候選者時(shí),被注解為@Primary的Bean將作為首選者毙沾,否則將拋出異常骗卜。

  • @ConfigurationProperties(prefix="spring.datasource.primary")

將前綴為spring.datasource.primary的配置注入到對應(yīng)名稱的屬性字段中。

此類作用為生成兩級DataSource,交由Spring管理寇仓,方便后續(xù)從Spring中調(diào)用举户。

package com.spring.security.config.datasource;

import javax.sql.DataSource;

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 com.zaxxer.hikari.HikariDataSource;

@Configuration
public class DataSourcesConfig {

    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix="spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create()
                .type(HikariDataSource.class)
                .build();
    }

    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties(prefix="spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create()
                .type(HikariDataSource.class)
                .build();
    }
}

PrimaryConfig.java

  • @Configuration

在Spring中注冊成bean

  • @EnableTransactionManagement

開啟事務(wù)管理

@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactoryPrimary",
transactionManagerRef="transactionManagerPrimary",
basePackages= { "com.spring.security.dao.primary" })

  • @EnableJpaRepositories

注解用于Srping JPA的代碼配置,用于取代xml形式的配置文件

  • entityManagerFactoryRef

實(shí)體管理工廠遍烦,下文代碼中配置基礎(chǔ)包為com.spring.security.entity.primary

  • transactionManagerRef

事務(wù)管理

  • basePackages

持久層基礎(chǔ)包掃描俭嘁,此處配置為com.spring.security.dao.primary

上述兩個(gè)包的配置,意為一級數(shù)據(jù)庫的實(shí)體和dao蹭接口分別所處的位置服猪。當(dāng)jpa進(jìn)行實(shí)體映射時(shí)供填,對應(yīng)包下面的實(shí)體會映射到不通的數(shù)據(jù)庫。dao層接口也會隨之切換罢猪。

package com.spring.security.config.datasource;

import java.util.Map;

import javax.persistence.EntityManager;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
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;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactoryPrimary",
        transactionManagerRef="transactionManagerPrimary",
        basePackages= { "com.spring.security.dao.primary" }) //設(shè)置Repository所在位置
public class PrimaryConfig {

    @Autowired 
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;

    @Autowired(required=false)
    private JpaProperties jpaProperties;

    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }

    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(primaryDataSource)
                .properties(getVendorProperties())
                .packages("com.spring.security.entity.primary") //設(shè)置實(shí)體類所在位置
                .persistenceUnit("primaryPersistenceUnit")
                .build();
    }

    private Map<String, Object> getVendorProperties() {
        return jpaProperties.getHibernateProperties(new HibernateSettings());
    }

    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }

}

SecondaryConfig.java

package com.spring.security.config.datasource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
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 javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Map;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactorySecondary",
        transactionManagerRef="transactionManagerSecondary",
        basePackages= { "com.spring.security.dao.secondary" }) //設(shè)置Repository所在位置
public class SecondaryConfig {

    @Autowired
    private JpaProperties jpaProperties;

    @Autowired 
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;

    @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())
                .packages("com.spring.security.entity.secondary") //設(shè)置實(shí)體類所在位置
                .persistenceUnit("secondaryPersistenceUnit")
                .build();
    }

    private Map<String, Object> getVendorProperties() {
        return jpaProperties.getHibernateProperties(new HibernateSettings());
    }

    @Bean(name = "transactionManagerSecondary")
    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }

}

如果需要擴(kuò)展更多數(shù)據(jù)庫近她,可以根據(jù)上述配置自行增加。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膳帕,一起剝皮案震驚了整個(gè)濱河市粘捎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌危彩,老刑警劉巖攒磨,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恬砂,居然都是意外死亡咧纠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門泻骤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漆羔,“玉大人,你說我怎么就攤上這事狱掂⊙菅鳎” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵趋惨,是天一觀的道長鸟顺。 經(jīng)常有香客問我,道長器虾,這世上最難降的妖魔是什么讯嫂? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮兆沙,結(jié)果婚禮上欧芽,老公的妹妹穿的比我還像新娘。我一直安慰自己葛圃,他們只是感情好千扔,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布憎妙。 她就那樣靜靜地躺著,像睡著了一般曲楚。 火紅的嫁衣襯著肌膚如雪厘唾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天龙誊,我揣著相機(jī)與錄音抚垃,去河邊找鬼。 笑死载迄,一個(gè)胖子當(dāng)著我的面吹牛讯柔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播护昧,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼魂迄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惋耙?” 一聲冷哼從身側(cè)響起捣炬,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绽榛,沒想到半個(gè)月后湿酸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灭美,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年推溃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片届腐。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铁坎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犁苏,到底是詐尸還是另有隱情硬萍,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布围详,位于F島的核電站朴乖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏助赞。R本人自食惡果不足惜买羞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雹食。 院中可真熱鬧哩都,春花似錦、人聲如沸婉徘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖呼。三九已至儒鹿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間几晤,已是汗流浹背约炎。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟹瘾,地道東北人圾浅。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像憾朴,于是被迫代替她去往敵國和親狸捕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348