springboot2.x 多数据源配置

1 application.properties多数据源的配置

多数据源为primary以及second数据源
//文件 application.properties
spring.datasource.primary.driverClassName=com.mysql.jdbc.Driver
spring.datasource.primary.url=jdbc:mysql://localhost:3306/jn_active_safety?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
spring.datasource.primary.username=root
spring.datasource.primary.password=1q2w3e

spring.datasource.second.driverClassName=com.mysql.jdbc.Driver
spring.datasource.second.url=jdbc:mysql://localhost:3306/active_safety?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
spring.datasource.second.username=root
spring.datasource.second.password=1q2w3e

2 多数据源DataSourceConfig 配置类的编写

/**
 * 
 * @author nj
 * 配置数据源 
 * springboot 1.x
 * @date 19/7/4 16:11.
 */
@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties("spring.datasource.primary")
    public DataSourceProperties firstDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.second")
    public DataSourceProperties shardingDataSourceProperties() {
        return new DataSourceProperties();
    }


    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    public DataSource DataSource(){
        return firstDataSourceProperties().initializeDataSourceBuilder().build();
    }

    @Bean(name = "secondDataSource")
    @Qualifier("secondDataSource")
    public DataSource sharDataSource(){
        return shardingDataSourceProperties().initializeDataSourceBuilder().build();
    }
    
    @Bean(name = "primaryJdbcTemplate")
    @Primary
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
    
    @Bean(name = "primaryNamedParameterJdbcTemplate")
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
    
    @Bean(name = "secondJdbcTemplate")
    public JdbcTemplate JdbcTemplate(@Qualifier("secondDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

3 多数据源涉及的事务管理

primary数据源的事务配置PrimaryConfig;
second数据源的事务配置SecondConfig;

3.1 PrimaryConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactoryPrimary",//实体管理工厂引用名称,对应到@Bean注解对应的方法
        transactionManagerRef = "transactionManagerPrimary",//事务管理工厂引用名称,对应到@Bean注解对应的方法
		basePackageClasses ={MileageDao.class}//设置Repository所在位置
//        basePackages = {"com.njusoft.its.dao","com.njusoft.its.safety.dao"}//设置Repository所在位置
        )
@Slf4j
public class PrimaryConfig {
	
	@Autowired
	@Qualifier("primaryDataSource")  
    private DataSource primaryDataSource;

    @Bean(name = "entityManagerFactoryPrimary")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource);
        em.setPackagesToScan("com.njusoft.its.model","com.njusoft.its.safety.entity", "com.njusoft.its.safety.domain.primary");
        em.setPersistenceUnitName("primaryPersistenceUnit");
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        return em;
    }

    @Primary
    @Bean(name = "transactionManagerPrimary")
    PlatformTransactionManager transactionManagerPrimary(@Qualifier("entityManagerFactoryPrimary") EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }

}

3.2 SecondConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactorySharding",//实体管理工厂引用名称,对应到@Bean注解对应的方法
        transactionManagerRef = "transactionManagersharding"//事务管理工厂引用名称,对应到@Bean注解对应的方法
        )
public class SecondConfig{
	
	@Autowired
	@Qualifier("secondDataSource")
    private DataSource shardingDataSource;

    @Bean(name = "entityManagerFactorySharding")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setDataSource(shardingDataSource);
            em.setPackagesToScan("com.njusoft.its.model","com.njusoft.its.safety.entity", "com.njusoft.its.safety.domain.sharding"); //设置实体类所在位置
            em.setPersistenceUnitName("shardingPersistenceUnit");
            final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
            em.setJpaVendorAdapter(vendorAdapter);
            return em;
    }

    @Bean(name = "transactionManagersharding")
    PlatformTransactionManager transactionManagerPrimary(@Qualifier("entityManagerFactorySharding") EntityManagerFactory emf) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
}

4 启动配置注意事项

启动类中需要注意排除默认的数据源配置
@Configuration
@SpringBootApplication(scanBasePackages={"com.njusoft.its"},exclude = {DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        JdbcTemplateAutoConfiguration.class})
@EnableTransactionManagement
@EnableScheduling
@EnableCaching //开启缓存功能
public class MainBootApplication {
//TODO
}

5 应用

由于在配置多数据源时用到了@primary注解,此注解代表优先数据源,即默认数据源;
/**
 * 基础DAO
 * Created by nj on 2019/05/28 0028.
 */
public class BaseDao {
	@PersistenceContext(unitName = "primaryPersistenceUnit")
	protected EntityManager entityManager;
	
	@Autowired
    protected JdbcTemplate jdbcTemplate;//代表primaryJdbcTemplate数据源
	
	@Autowired
	@Qualifier("primaryNamedParameterJdbcTemplate")
    protected NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    public EntityManager getEntityManager() {
		return entityManager;
	}
    
    public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}
    
    public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
    	NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate.getDataSource());
		return namedParameterJdbcTemplate;
	}
}`
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值