zoukankan      html  css  js  c++  java
  • SpringBoot + JPA 配置双数据源

    一、首先配置application.yml 

    server:
      port: 8081
      servlet:
        context-path: /
    
      #是否开启压缩,默认false
      compression:
        enabled: true
        #执行压缩的阀值,默认2048,单位:字节B
        min-response-size: 2048
        #指定要压缩的MIME type,多个以逗号分隔,[text/html, text/xml, text/plain, text/css, text/javascript, application/javascript, application/json, application/xml]
        mime-types: application/json,application/xml,text/html,text/xml,text/plain
    
    spring:
      application:
        name: chint-kml-api
      datasource:
        ds1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          jdbc-url: jdbc:mysql://xx:3306/chiticbank?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=UTC
          username: xx
          password: xx@123
        ds2:
          driver-class-name: com.mysql.cj.jdbc.Driver
          jdbc-url: jdbc:mysql://xx:3306/smartpower?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
          username: xx
          password: xx@123456
        type: com.zaxxer.hikari.HikariDataSource
        hikari:
          minimum-idle: 5
          maximum-pool-size: 15
          auto-commit: true
          idle-timeout: 30000
          pool-name: DatebookHikariCP
          max-lifetime: 1800000
          connection-timeout: 30000
          connection-test-query: SELECT 1
      jpa:
        show-sql: true
        hibernate:
          ddl-auto: update
        database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
        database: mysql

    二、使用配置类读取application.yml配置的两个数据源,并将其注入到Spring的IOC容器中

    package com.chint.kml.api.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;
     
     
    @Configuration
    public class DataSourceConfig {
     
        @Bean(name = "ds1DataSource")
        @Qualifier("ds1DataSource")
        @Primary
        @ConfigurationProperties(prefix = "spring.datasource.ds1")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
     
        @Bean(name = "ds2DataSource")
        @Qualifier("ds2DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.ds2")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
     
    }

    三、配置两个数据源

     (一):数据源1

    package com.chint.kml.api.config;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
    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;
    
    import javax.persistence.EntityManager;
    import javax.sql.DataSource;
    import java.util.Map;
    
    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
            entityManagerFactoryRef = "entityManagerFactoryDs1",
            transactionManagerRef = "transactionManagerDs1",
            basePackages = {"com.chint.kml.api.repository.rep1"})
    public class Ds1Config {
    
        @Autowired
        @Qualifier("ds1DataSource")
        private DataSource ds1Datasource;
    
        @Autowired
        private JpaProperties jpaProperties;
    
        @Autowired
        private HibernateProperties hibernateProperties;
    
        private Map<String, Object> getVendorProperties() {
            return hibernateProperties.determineHibernateProperties(
                    jpaProperties.getProperties(), new HibernateSettings());
        }
    
        @Bean(name = "entityManagerDs1")
        @Primary
        public EntityManager entityManagerDs1(EntityManagerFactoryBuilder builder) {
            return entityManagerFactoryDs1(builder).getObject().createEntityManager();
        }
    
        /**
         * 设置实体类所在位置
         */
        @Bean(name = "entityManagerFactoryDs1")
        @Primary
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryDs1(EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(ds1Datasource)
                    .packages("com.chint.kml.api.repository.rep1")
                    .persistenceUnit("ds1PersistenceUnit")
                    .properties(getVendorProperties())
                    .build();
        }
    
        @Bean(name = "transactionManagerDs1")
        @Primary
        public PlatformTransactionManager transactionManagerDs1(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactoryDs1(builder).getObject());
        }
    
    }

     (二):数据源2

    package com.chint.kml.api.config;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
    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 = "entityManagerFactoryDs2",
            transactionManagerRef = "transactionManagerDs2",
            basePackages = {"com.chint.kml.api.repository.rep2"})
    public class Ds2Config {
    
        @Autowired
        @Qualifier("ds2DataSource")
        private DataSource ds2Datasource;
    
        @Autowired
        private JpaProperties jpaProperties;
    
        @Autowired
        private HibernateProperties hibernateProperties;
    
        private Map<String, Object> getVendorProperties() {
            return hibernateProperties.determineHibernateProperties(
                    jpaProperties.getProperties(), new HibernateSettings());
        }
    
        @Bean(name = "entityManagerDs2")
        public EntityManager entityManagerDs2(EntityManagerFactoryBuilder builder) {
            return entityManagerFactoryDs2(builder).getObject().createEntityManager();
        }
    
        /**
         * 设置实体类所在位置
         */
        @Bean(name = "entityManagerFactoryDs2")
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryDs2(EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(ds2Datasource)
                    .packages("com.chint.kml.api.repository.rep2")
                    .persistenceUnit("ds2PersistenceUnit")
                    .properties(getVendorProperties())
                    .build();
        }
    
        @Bean(name = "transactionManagerDs2")
        public PlatformTransactionManager transactionManagerDs2(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactoryDs2(builder).getObject());
        }
    
    }

    四、启动类主函数入口

    SpringBoot启动类需关闭注解 ,程序启动加载的仓库(@EnableJpaRepositories),因为在数据源配置类中已经开启了
    @SpringBootApplication
    //@EnableJpaRepositories
    @ComponentScan(CoreConstants.BASE_PACKAGE)
    public class ChintKmlApiServiceApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ChintKmlApiServiceApplication.class, args);
            LoadPoints loadPoints = SpringUtils.getBean(LoadPoints.class);
            loadPoints.loadPoints();
        }
    
    }

    注意:springboot版本

    2.3.8.RELEASE
    既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去!!!!!!!!!! !!! ! !! ! 个人公众号《后端技术开发之路》,欢迎您关注!

    如果您觉得我写还不过,请打赏下在下吧!【高木子】!

  • 相关阅读:
    fortran imsl 程序库
    使用NET USE将USB端口模拟为LPT1
    Processing鼠标响应(1)
    MATLAB矩阵运算(1)
    Processing中类的定义
    Perl的第二纪
    Processing鼠标响应(2)
    Processing中的图片互动
    gFortran的使用
    用回溯法来产生由0或1组成的2m个二进位串,使该串满足以下要求
  • 原文地址:https://www.cnblogs.com/gaomanito/p/14913520.html
Copyright © 2011-2022 走看看