最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring-data-jpa+Alibaba Druid多數(shù)據(jù)源案例實(shí)踐

 更新時(shí)間:2025年07月14日 09:47:27   作者:勤匠  
本文介紹基于Spring Data JPA與Alibaba Druid配置多數(shù)據(jù)源的方案,通過(guò)定義三個(gè)獨(dú)立數(shù)據(jù)源、分別設(shè)置JPA配置及實(shí)體/倉(cāng)庫(kù)包,實(shí)現(xiàn)訂單、用戶、詳情表的分離管理

spring-data-jpa+Alibaba Druid多數(shù)據(jù)源

很多情況下,應(yīng)用需要連接多個(gè)數(shù)據(jù)庫(kù),基于此場(chǎng)景,我介紹如何使用spring-data-jpa + Alibaba Druid配置多數(shù)據(jù)源。

代碼量有點(diǎn)大,請(qǐng)耐心:

假設(shè)一個(gè)場(chǎng)景

數(shù)據(jù)庫(kù)服務(wù)器IP占用端口
testorders(訂單表)192.168.10.313306
demodetail(詳情表)192.168.10.323306
trainusers(用戶表)192.168.10.333306

pom.xml引入

<!--連接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>
<!--數(shù)據(jù)庫(kù)驅(qū)動(dòng)-->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
<!--spring data jpa-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

application.yaml配置

server:
  port: 8080
spring:
  datasource:
    ds1:
      url: jdbc:mysql://192.168.10.31:3306/test
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
    ds2:
      url: jdbc:mysql://192.168.10.33:3306/train
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
    ds3:
      url: jdbc:mysql://192.168.10.32:3306/demo
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver

DataSource配置

為了讓spring-data-jpa分別使用這三個(gè)庫(kù),那么我們需要配置3個(gè)datasource

package cn.train.springdruid.config.datasource;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
/**
 * 多數(shù)據(jù)源配置
 * */
@Configuration
public class DataSourcesConfig {
    @Bean(name = {"ds1"})
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.ds1")
    public DataSource ds1() {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return dataSource;
    }
    @Bean(name = {"ds2"})
    @ConfigurationProperties(prefix = "spring.datasource.ds2")
    public DataSource ds2() {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return dataSource;
    }
    @Bean(name = {"ds3"})
    @ConfigurationProperties(prefix = "spring.datasource.ds3")
    public DataSource ds3() {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        return dataSource;
    }
}

JPA配置

接下來(lái)針對(duì)每個(gè)datasource做單獨(dú)的JPA配置

ds1的JPA配置

package cn.train.springdruid.config.datasource;

import org.springframework.beans.factory.annotation.Qualifier;
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.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration(value = "ds1JPAConfig")
@EnableJpaRepositories(
        basePackages = "cn.train.springdruid.repositories.ds1",//repository包位置
        entityManagerFactoryRef = "ds1EntityManagerFactory",
        transactionManagerRef = "ds1TransactionManager"
)
public class Ds1JPAConfig {
    @Bean(name = {"ds1TransactionManager"})
    public PlatformTransactionManager ds1TransactionManager(
            @Qualifier("ds1EntityManagerFactory") EntityManagerFactory emf){
        return new JpaTransactionManager(emf);
    }
    @Bean(name = {"ds1EntityManagerFactory"})
    @Primary
    public LocalContainerEntityManagerFactoryBean ds1EntityManagerFactory(
            @Qualifier(value = "ds1") DataSource dataSource,
            JpaVendorAdapter vendorAdapter) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        entityManagerFactoryBean.setPackagesToScan("cn.train.springdruid.entities.ds1");// entity包位置
        entityManagerFactoryBean.setJpaProperties(
                new Properties(){{
                    put("hibernate.hbm2ddl.auto", "update");
                    put("hibernate.show_sql", "true");
                    put("hibernate.format_sql", "true");
                }}
        );
        return entityManagerFactoryBean;
    }
}

ds2的JPA配置

package cn.train.springdruid.config.datasource;

import org.springframework.beans.factory.annotation.Qualifier;
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.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration(value = "ds2JPAConfig")
@EnableJpaRepositories(
        basePackages = "cn.train.springdruid.repositories.ds2",//repository包位置
        entityManagerFactoryRef = "ds2EntityManagerFactory",
        transactionManagerRef = "ds2TransactionManager"
)
public class Ds2JPAConfig {
    @Bean(name = {"ds2TransactionManager"})
    public PlatformTransactionManager ds2TransactionManager(
            @Qualifier("ds2EntityManagerFactory") EntityManagerFactory emf){
        return new JpaTransactionManager(emf);
    }
    @Bean(name = {"ds2EntityManagerFactory"})
    public LocalContainerEntityManagerFactoryBean ds2EntityManagerFactory(
            @Qualifier(value = "ds2") DataSource dataSource,
            JpaVendorAdapter vendorAdapter) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        entityManagerFactoryBean.setPackagesToScan("cn.train.springdruid.entities.ds2");// entity包位置
        entityManagerFactoryBean.setJpaProperties(
                new Properties(){{
                    put("hibernate.hbm2ddl.auto", "update");
                    put("hibernate.show_sql", "true");
                    put("hibernate.format_sql", "true");
                }}
        );
        return entityManagerFactoryBean;
    }
}

ds3的JPA配置

package cn.train.springdruid.config.datasource;

import org.springframework.beans.factory.annotation.Qualifier;
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.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;

@Configuration(value = "ds3JPAConfig")
@EnableJpaRepositories(
        basePackages = "cn.train.springdruid.repositories.ds3",//repository包位置
        entityManagerFactoryRef = "ds3EntityManagerFactory",
        transactionManagerRef = "ds3TransactionManager"
)
public class Ds3JPAConfig {
    @Bean(name = {"ds3TransactionManager"})
    public PlatformTransactionManager ds3TransactionManager(
            @Qualifier("ds3EntityManagerFactory") EntityManagerFactory emf){
        return new JpaTransactionManager(emf);
    }
    @Bean(name = {"ds3EntityManagerFactory"})
    public LocalContainerEntityManagerFactoryBean ds3EntityManagerFactory(
            @Qualifier(value = "ds3") DataSource dataSource,
            JpaVendorAdapter vendorAdapter) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        entityManagerFactoryBean.setPackagesToScan("cn.train.springdruid.entities.ds3");// entity包位置
        entityManagerFactoryBean.setJpaProperties(
                new Properties(){{
                    put("hibernate.hbm2ddl.auto", "update");
                    put("hibernate.show_sql", "true");
                    put("hibernate.format_sql", "true");
                }}
        );
        return entityManagerFactoryBean;
    }
}

ds1的repository包為:cn.train.springdruid.repositories.ds1,其中是OrderRepository

import cn.train.springdruid.entities.ds1.Order;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository(value = "orderRepository")
public interface OrderRepository extends JpaRepository<Order, Long> {
}

ds2的repository包為:cn.train.springdruid.repositories.ds2,其中是UserRepository

package cn.train.springdruid.repositories.ds2;

import cn.train.springdruid.entities.ds2.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository(value = "userRepository")
public interface UserRepository extends JpaRepository<User, Long> {
}

ds3的repository包為:cn.train.springdruid.repositories.ds3,其中是DetailRepository

package cn.train.springdruid.repositories.ds3;

import cn.train.springdruid.entities.ds3.Detail;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository(value = "detailRepository")
public interface DetailRepository extends JpaRepository<Detail, Long> {
}

entity

ds1的entity包為:cn.train.springdruid.entities.ds1,其中是Order

package cn.train.springdruid.entities.ds1;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "order_name")
    private String name;

    @Column(name = "order_price")
    private Integer price;
}

ds2的entity包為:cn.train.springdruid.entities.ds2,其中是:User

package cn.train.springdruid.entities.ds2;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "user_name")
    private String name;

    @Column(name = "user_age")
    private Integer age;
}

ds3的entity包為:cn.train.springdruid.entities.ds3,其中是:Detail

package cn.train.springdruid.entities.ds3;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "detail")
public class Detail {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    
    @Column(name = "description")
    private String description;
}

由此,就是整個(gè)多數(shù)據(jù)源配置與管理的全部核心代碼

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java五種方式實(shí)現(xiàn)多線程循環(huán)打印問(wèn)題

    Java五種方式實(shí)現(xiàn)多線程循環(huán)打印問(wèn)題

    本文主要介紹了Java五種方式實(shí)現(xiàn)多線程循環(huán)打印問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java語(yǔ)言中4種內(nèi)部類(lèi)的超詳細(xì)講解

    Java語(yǔ)言中4種內(nèi)部類(lèi)的超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于Java語(yǔ)言中4種內(nèi)部類(lèi)的超詳細(xì)講解,內(nèi)部類(lèi)可以分為:實(shí)例內(nèi)部類(lèi)、靜態(tài)內(nèi)部類(lèi)和成員內(nèi)部類(lèi),每種內(nèi)部類(lèi)都有它特定的一些特點(diǎn),文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • MyBatis一二級(jí)緩存

    MyBatis一二級(jí)緩存

    這篇文章主要介紹了MyBatis一二級(jí)緩存的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Java中旋轉(zhuǎn)PDF頁(yè)面的三種實(shí)現(xiàn)方法指南

    Java中旋轉(zhuǎn)PDF頁(yè)面的三種實(shí)現(xiàn)方法指南

    在處理 PDF 文件時(shí),我們常會(huì)遇到頁(yè)面方向不正確的問(wèn)題,在 Java 中,我們可以通過(guò)程序化方式旋轉(zhuǎn) PDF 頁(yè)面,從而避免手動(dòng)操作,提高處理效率,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧
    2026-01-01
  • springboot 如何使用jackson來(lái)處理實(shí)體類(lèi)

    springboot 如何使用jackson來(lái)處理實(shí)體類(lèi)

    這篇文章主要介紹了springboot使用jackson來(lái)處理實(shí)體類(lèi)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • JVM生產(chǎn)環(huán)境調(diào)優(yōu)實(shí)戰(zhàn)案例講解

    JVM生產(chǎn)環(huán)境調(diào)優(yōu)實(shí)戰(zhàn)案例講解

    這篇文章主要介紹了JVM生產(chǎn)環(huán)境調(diào)優(yōu)實(shí)戰(zhàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-04-04
  • JAVA中ArrayList和數(shù)組的轉(zhuǎn)換與遇到的問(wèn)題解決

    JAVA中ArrayList和數(shù)組的轉(zhuǎn)換與遇到的問(wèn)題解決

    做研發(fā)的朋友都知道,在項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)碰到ArrayList與數(shù)組類(lèi)型之間的相互轉(zhuǎn)換,這篇文章主要給大家介紹了關(guān)于JAVA中ArrayList和數(shù)組的轉(zhuǎn)換與遇到的問(wèn)題解決,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • RedisTemplate和Redisson的區(qū)別

    RedisTemplate和Redisson的區(qū)別

    本文主要介紹了RedisTemplate和Redisson的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • IDEA下SpringBoot指定環(huán)境、配置文件啟動(dòng)操作過(guò)程

    IDEA下SpringBoot指定環(huán)境、配置文件啟動(dòng)操作過(guò)程

    這篇文章主要介紹了IDEA下SpringBoot指定環(huán)境、配置文件啟動(dòng)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法

    新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法

    這篇文章主要介紹了新版IDEA使用Spring Initializr創(chuàng)建工程(兩種方法,官方工具和IDEA),文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-10-10

最新評(píng)論

岐山县| 什邡市| 革吉县| 沧源| 攀枝花市| 达孜县| 沾益县| 荃湾区| 信阳市| 宝清县| 高碑店市| 太和县| 确山县| 工布江达县| 岳普湖县| 东辽县| 邳州市| 沁水县| 安福县| 弋阳县| 余江县| 建德市| 泰兴市| 永和县| 象州县| 永州市| 孟州市| 临沂市| 筠连县| 江安县| 上饶县| 教育| 当雄县| 萨迦县| 阳朔县| 鄄城县| 含山县| 保山市| 奉化市| 营山县| 平乡县|