SpringBoot多数据源
maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.6</version>
</dependency>
application.yml
datasource:
druid: # Druid数据源配置
driver-class-name: com.mysql.jdbc.Driver
master:
url: jdbc:mysql://127.0.0.1:3306/jframe?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: 12345678
cluster:
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
username: root
password: 12345678
DbMasterConfig
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.jf.mapper", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class DbMasterConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) {
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(masterDataSource);
// we MUST set the 'VFS' if you use jar
bean.setVfs(SpringBootVFS.class);
// 实体类位置
bean.setTypeAliasesPackage("com.jf.model");
// 设置mapper.xml文件所在位置
org.springframework.core.io.Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/jf/mapper/xml/*.xml");
bean.setMapperLocations(resources);
// 添加分页插件
PageInterceptor pageHelper = new PageInterceptor();
Properties p = new Properties();
p.setProperty("helperDialect", "mysql");
p.setProperty("supportMethodsArguments", "true");
p.setProperty("params", "pageNum=pageNo;pageSize=pageSize;");
pageHelper.setProperties(p);
Interceptor[] plugins = new Interceptor[]{pageHelper};
bean.setPlugins(plugins);
return bean.getObject();
} catch (Exception e) {
logger.error("DB Master sqlSessionFactory create error!", e);
return null;
}
}
@Bean
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
/**
* 事务管理
*
* @return
*/
@Bean
@Primary
public PlatformTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource masterDataSource) {
return new DataSourceTransactionManager(masterDataSource);
}
}
DbClusterConfig
DbClusterConfig类似,修改MapperScan
和MapperLocations
位置,删除@Primary
,将clusterDataSource
注入
测试
Service
public User testMutilSource(String source) {
User user = null;
if ("master".equals(source)) {
user = userMapper.findById(10000l);
}
if ("cluster".equals(source)) {
user = user2Mapper.findById(10000l);
}
return user;
}
@Transactional(value = "masterTransactionManager")
public void testRollbackA() {
User user = userMapper.findById(10000l);
user.setNickname("master_rollback");
userMapper.update(user);
System.out.println(1 / 0); // error
user = new User(10001l);
user.setNickname("master_rollback2");
userMapper.update(user);
}
@Transactional(value = "clusterTransactionManager")
public void testRollbackB() {
User user = user2Mapper.findById(10000l);
user.setNickname("cluster_rollback");
user2Mapper.update(user);
System.out.println(1 / 0);
user = new User(10001l);
user.setNickname("cluster_rollback2");
user2Mapper.update(user);
}
两个数据源均生效,并正常执行事务