上一篇博客用aop最终页没实现完美的多数据源。最终只能在所有配置配双份加@Primary注解,用最笨的方法实现了。
1、把原先的datasource部分配置配置两份,不能写在一个配置文件中不然告诉你已经存在了。定义两个配置文件
单个配置文件(主):
package com.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
/**
* @Author huangsan
* @create 2019/8/6 10:36
*/
@Configuration
@MapperScan(basePackages = "com.boot.*.dao.**", sqlSessionFactoryRef = "sqlSessionFactory1")
public class DataSourceConfig {
@Bean(name = "dataSource1")
@Primary
@ConfigurationProperties("spring.datasource.druid.first")
public DataSource initDataSource() {
return new DruidDataSource();
}
@Bean(name = "sqlSessionFactory1")
@Primary
public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource datasource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(datasource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml"));
bean.setTypeAliasesPackage("com.boot");
return bean.getObject();
}
@Bean("sqlSessionTemplate1")
@Primary
public SqlSessionTemplate sqlSessionTemplate1(
@Qualifier("sqlSessionFactory1") SqlSessionFactory sessionfactory) {
return new SqlSessionTemplate(sessionfactory);
}
@Bean
@Primary
public PlatformTransactionManager platformTransactionManager(@Qualifier("dataSource1") DataSource dataSource1) {
return new DataSourceTransactionManager(dataSource1);
}
}
另一个配置文件中配置和这个一样,将所有name都改变一下。把@Primary去掉(@Primary指定默认值)。
注意:1)另一个配置中PlatformTransactionManager的bean需要给个name,或者两个配置文件中都给也可以。
2)@MapperScan扫描的包结构别交叉。
2、使用更简单,如果是主表的就直接用注解@Transactional。如果是其他的库需要使用@Transactional(transactionManager = "tm2")指定PlatformTransactionManager的name。
以上就是多数据源的配置了。