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

来源:互联网 发布:配音朗读软件 编辑:程序博客网 时间:2024/06/07 17:13

1 配置文件

wisely.primary.datasource.driverClassName=oracle.jdbc.OracleDriverwisely.primary.datasource.url=jdbc\:oracle\:thin\:@192.168.1.103\:1521\:xewisely.primary.datasource.username=giswisely.primary.datasource.password=gis wisely.secondary.datasource.driverClassName=oracle.jdbc.OracleDriverwisely.secondary.datasource.url=jdbc\:oracle\:thin\:@192.168.1.103\:1522\:xewisely.secondary.datasource.username=giswisely.secondary.datasource.password=gis

2 datasource配置

第一个数据源

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

第二个数据源

@Configurationpublic 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里注入

@Controllerpublic 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";  } }
2 0
原创粉丝点击