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;
}
}`