(原)springboot jpa 配置多数据源(多数据源:大于等于2个数据库)

本文详细介绍如何在Spring框架中配置并使用多个数据源,包括DataSource的创建与配置、JPA配置以及实体类和数据访问接口的设计。

异常:dataSource或dataSourceClassName或jdbcUrl是必需的。【下面有介绍】

因为光速没有URL属性(但是确实有一个JDBCURL属性)。在这种情况下,您必须重写您的配置如下

spring.datasource.primary.url=jdbc:mysql://IP地址/drp_db
 
spring.datasource.primary.jdbc-url=jdbc:mysql://IP地址/drp_db
 进入正题:
//感谢老师!------------------  https://blog.youkuaiyun.com/junqilong/article/details/79423687

首先创建DataSource,只需要为其注入对应的JdbcTemplate

/***
 * 配置多数据源
 * @author free-knight
 *
 */
@Configuration
public class DataSourceConfig {
 
        /***
         * 配置主数据源
         * @return
         */
          @Bean(name = "primaryDataSource")
        @Qualifier("primaryDataSource")
        @ConfigurationProperties(prefix="spring.datasource.primary")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
          
       /****
        * 配置数据源    
        * @return
        */
        @Bean(name = "secondaryDataSource")
        @Qualifier("secondaryDataSource")
        @Primary
        @ConfigurationProperties(prefix="spring.datasource.secondary")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
        
        @Bean(name = "primaryJdbcTemplate")
        public JdbcTemplate primaryJdbcTemplate(
                @Qualifier("primaryDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
        
        @Bean(name = "secondaryJdbcTemplate")
        public JdbcTemplate secondaryJdbcTemplate(
                @Qualifier("secondaryDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
}
 其次创建spring.xml文件的多数据源信息

然后,数据源的JPA配置(几个数据源,几个相应名称匹配的配置,自己理解,后期尽量改成批量方式):注意注释的部分  

/****
 * 配置主数据源
 * @author wangning
 *
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactoryPrimary",
        transactionManagerRef="transactionManagerPrimary",
        basePackages= { "com.primary.*.repository.*" }) //设置Repository所在位置
public class PrimaryConfig {
    
    @Autowired 
    @Qualifier("primaryDataSource")
    private DataSource primaryDataSource;
    
    @Autowired 
    private Properties jpaPrimaryProperties;
    
    @Primary
    @Bean(name = "entityManagerPrimary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
    }
    
    @Primary
    @Bean(name = "entityManagerFactoryPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
////////////////////////////////////////
//这一部分 自己修改,网上内容不是这样,但是引用后,不显示有问题存在,所以自己改成如下
        LocalContainerEntityManagerFactoryBean entityManagerFactory 
                    =  builder
                            .dataSource(primaryDataSource)
                            .packages("com.primary.*.entity.*")//设置实体类所在位置
                            .persistenceUnit("primaryPersistenceUnit")//持久化单元创建一个默认即可,多个便要分别命名
                            .build();
         entityManagerFactory.setJpaProperties(jpaPrimaryProperties);
         return entityManagerFactory;
/////////////////////////////////////////////////////////////
    }
  
    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }
/*****
 * 配置从数据源
 * @author free-knight
 *
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerFactorySecondary",
        transactionManagerRef="transactionManagerSecondary",
        basePackages= { "com.secondary.*.repository.*" }) //设置Repository所在位置
public class SecondaryConfig {
    
    @Autowired 
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;
    
    @Autowired
    private Properties jpaSecondaryProperties;
    
    
    @Bean(name = "entityManagerSecondary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactorySecondary(builder).getObject().createEntityManager();
    }
    
    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
        
        LocalContainerEntityManagerFactoryBean entityManagerFactory 
                    =  builder
                            .dataSource(secondaryDataSource)
                            .packages("com.secondary.*.entity.*")//设置实体类所在位置
                            .persistenceUnit("secondaryPersistenceUnit")
                            .build();
            entityManagerFactory.setJpaProperties(jpaSecondaryProperties);
            return entityManagerFactory;
    }
    
    @Bean(name = "transactionManagerSecondary")
    PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }
 
}
 

最后,分别在这两个包下创建各自的实体和数据访问接口

测试结果:


--------------------- 
作者:快找一个值得变态的事情去做! 
来源:优快云 
原文:https://blog.youkuaiyun.com/qq_31653405/article/details/83061388 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值