多数据源之静态方法
目标:我们要从同一个方法中取出不同数据库的数据
效果:
GetMapping("/1")
public void test() {
System.out.println("shiro数据库:"+um2.get(1));
System.out.println("springboot数据库:"+um1.get(1));
}
思路:我们要写两个数据库的配置,然后创建datasource,transaction,sqlSessionFactory
#datasource1
master1.datasource.url=jdbc:mysql://localhost:3306/springboot
master1.datasource.username=root
master1.datasource.password=
master1.datasource.driverClassName=com.mysql.jdbc.Driver
#datasource2
master2.datasource.url=jdbc:mysql://localhost:3306/shiro
master2.datasource.username=root
master2.datasource.password=
master2.datasource.driverClassName=com.mysql.jdbc.Driver
我们要读取配置文件的数据库配置,注入mapper
@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = Master2DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "master2SqlSessionFactory")
public class Master2DataSourceConfig {
// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.Tom.mapper2";
static final String MAPPER_LOCATION = "com/tom/mapper2/userMapper.xml";
@Value("${master2.datasource.url}")
private String url;
@Value("${master2.datasource.username}")
private String user;
@Value("${master2.datasource.password}")
private String password;
@Value("${master2.datasource.driverClassName}")
private String driverClass;
@Bean(name = "master2DataSource")
public DataSource master2DataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
System.out.println("数据库2创建OK!!");
return dataSource;
}
@Bean(name = "master2TransactionManager")
public DataSourceTransactionManager master2TransactionManager() {
System.out.println("事务管理器2创建OK!!");
return new DataSourceTransactionManager(master2DataSource());
}
@Bean(name = "master2SqlSessionFactory")
public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("master2DataSource") DataSource master2DataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(master2DataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(Master2DataSourceConfig.MAPPER_LOCATION));
System.out.println("sql工厂2创建ok!!");
return sessionFactory.getObject();
}
}
@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = Master1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "master1SqlSessionFactory")
public class Master1DataSourceConfig {
// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.tom.mapper1";
static final String MAPPER_LOCATION = "com/tom/mapper1/userMapper.xml";
@Value("${master1.datasource.url}")
private String url;
@Value("${master1.datasource.username}")
private String user;
@Value("${master1.datasource.password}")
private String password;
@Value("${master1.datasource.driverClassName}")
private String driverClass;
@Bean(name = "master1DataSource")
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
System.out.println("数据库1创建OK!!");
return dataSource;
}
@Bean(name = "master1TransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
System.out.println("事务管理器1创建OK!!");
return new DataSourceTransactionManager(masterDataSource());
}
@Bean(name = "master1SqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("master1DataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(Master1DataSourceConfig.MAPPER_LOCATION));
System.out.println("sql工厂1创建ok!!");
return sessionFactory.getObject();
}
}
@Primary 标志这个 Bean 如果在多个同类 Bean 候选时,该 Bean 优先被考虑。「多数据源配置的时候注意,必须要有一个主数据源,用 @Primary 标志该 Bean」
@MapperScan 扫描 Mapper 接口并容器管理,包路径精确到 master,为了和下面 cluster 数据源做到精确区分
@Value 获取全局配置文件 application.properties 的 kv 配置,并自动装配
sqlSessionFactoryRef 表示定义了 key ,表示一个唯一 SqlSessionFactory 实例
mapper需要分开写
@RestController
public class testController {
@Autowired
private userMapper1 um1;
@Autowired
private userMapper2 um2;
@GetMapping("/1")
public void test() {
System.out.println("shiro数据库:"+um2.get(1));
System.out.println("springboot数据库:"+um1.get(1));
}
}
好处:简单可用,易配置
坏处:局限较大,不易扩展
多数据源之动态方式
https://blog.csdn.net/maoyeqiu/article/details/74011626