• Spring Boot,Spring Data JPA多数据源支持


    1 配置文件

    wisely.primary.datasource.driverClassName=oracle.jdbc.OracleDriver
    wisely.primary.datasource.url=jdbc:oracle:thin:@192.168.1.103:1521:xe
    wisely.primary.datasource.username=gis
    wisely.primary.datasource.password=gis
     
    wisely.secondary.datasource.driverClassName=oracle.jdbc.OracleDriver
    wisely.secondary.datasource.url=jdbc:oracle:thin:@192.168.1.103:1522:xe
    wisely.secondary.datasource.username=gis
    wisely.secondary.datasource.password=gis

    2 datasource配置

    第一个数据源

    @Configuration
    public class DataSourcePrimaryConfig {
    
      @Bean(name = "primaryDS") @Qualifier("primaryDS")
      @Primary
      @ConfigurationProperties(prefix="wisely.primary.datasource")
      public DataSource primaryDataSource(){
        return DataSourceBuilder.create().build();
      }
    
    }

    第二个数据源

    @Configuration
    public class DataSourceSecondaryConfig {
      @Bean(name = "secondaryDS") @Qualifier("secondaryDS")
      @ConfigurationProperties(prefix="wisely.secondary.datasource")
      public DataSource secondaryDataSource(){
        return DataSourceBuilder.create().build();
      }
    }

    3 实体管理器及事务管理器配置

    第一个数据源

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",transactionManagerRef="transactionManagerPrimary",basePackages= { "com.wisely.demo.dao.one" })//设置dao(repo)所在位置
    public class RepositoryPrimaryConfig {
        @Autowired
        private JpaProperties jpaProperties;
    
        @Autowired @Qualifier("primaryDS")
        private DataSource primaryDS;
    
        @Bean(name = "entityManagerPrimary")
        @Primary
        public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
            return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
        }
    
        @Bean(name = "entityManagerFactoryPrimary")
        @Primary
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(primaryDS)
                    .properties(getVendorProperties(primaryDS))
                    .packages("com.wisely.demo.domain.one") //设置实体类所在位置
                    .persistenceUnit("primaryPersistenceUnit")
                    .build();
        }
    
        private Map<String, String> getVendorProperties(DataSource dataSource) {
            return jpaProperties.getHibernateProperties(dataSource);
        }
    
        @Bean(name = "transactionManagerPrimary")
        @Primary
        PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
        }
    
    }

    第二个数据源

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary",transactionManagerRef="transactionManagerSecondary",basePackages= { "com.wisely.demo.dao.two" })
    public class RepositorySecondaryConfig {
        @Autowired
        private JpaProperties jpaProperties;
    
        @Autowired @Qualifier("secondaryDS")
        private DataSource secondaryDS;
    
        @Bean(name = "entityManagerSecondary")
        public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
            return entityManagerFactorySecondary(builder).getObject().createEntityManager();
        }
    
        @Bean(name = "entityManagerFactorySecondary")
        public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
            return builder
                    .dataSource(secondaryDS)
                    .properties(getVendorProperties(secondaryDS))
                    .packages("com.wisely.demo.domain.two")
                    .persistenceUnit("secondaryPersistenceUnit")
                    .build();
        }
    
        private Map<String, String> getVendorProperties(DataSource dataSource) {
            return jpaProperties.getHibernateProperties(dataSource);
        }
    
        @Bean(name = "transactionManagerSecondary")
        PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
            return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
        }
    
    }

    4 使用

    此时来自不同数据库的dao(repo)可以任意在其它的bean里注入

    @Controller
    public class TestController {
      @Autowired
      SysRoleRepo1 sysRoleRepo1;
      @Autowired
      SysRoleRepo2 sysRoleRepo2;
      @RequestMapping("/test")
      public @ResponseBody String test(){
        System.out.println(Lists.newArrayList(sysRoleRepo1.findAll()).size());
        System.out.println(Lists.newArrayList(sysRoleRepo2.findAll()).size());
        return "ok";
      } 
    }
  • 相关阅读:
    局域网主机A向主机B发送ip数据报的过程
    用户使用浏览器访问万维网经历的步骤
    sql
    PMP:总概
    LINQ
    下拉框
    PMP:项目采购管理
    PMP:项目风险管理
    PMP:沟通管理。相关方管理
    PMP:项目资源管理
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696542.html
Copyright © 2020-2023  润新知