• 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";
      } 
    }
  • 相关阅读:
    ext与xfs文件系统比较与总结
    MySQL prepare 原理
    MySQL 性能监控 4 大指标
    MySQL数据库设计规范
    What To Do When MySQL Runs Out of Memory: Troubleshooting Guide
    MySQL 8.0 —— CATS事务调度算法的性能提升
    MySQL5.7中的sql_mode默认值
    MySQL8.0——Resource Group(资源组)
    MySQL 8.0 —— 数据字典
    mysqlreport工具
  • 原文地址:https://www.cnblogs.com/duyinqiang/p/5696541.html
Copyright © 2020-2023  润新知