springboot多数据源
我们在项目中有时为了方便,会使用过数据源来做一些复杂业务逻辑,本文主要讲解项目中多数据源的配置
1. DataSource、SqlSession、SqlSessionFactory
在springmvc 或者springboot中,数据库的操作主要是通过SqlSession来完成,而SqlSession 是通过SqlSessionFactory来build的,SqlSessionFactory又依赖于DataSource,由此我们可以在项目中创建多个DataSource、SqlSession、SqlSessionFactory 来区分不同的数据源
例如
数据源A 包含 DataSourceA ,SqlSessionA,SqlSessionFactoryA
数据源B 包含 DataSourceB ,SqlSessionB,SqlSessionFactoryB
......
每个SqlSessionFactory绑定不同的xml,SqlSession绑定不同的mapper,这样就能根据不同的mapper映射自动选择不同的数据源
2.实战
数据源A
@Configuration @MapperScan(basePackages = "com.example.mapper.a", sqlSessionTemplateRef = "aSqlSessionTemplate") public class DataSourceAConfig { @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Bean(name = "aDataSource") public DataSource aDataSource() throws SQLException { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setFilters("stat"); return dataSource; } @Bean(name = "aSqlSessionFactory") public SqlSessionFactory aSqlSessionFactory(@Qualifier("aDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); Properties properties = new Properties(); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "count=countSql"); properties.setProperty("reasonable", "false"); // 添加插件 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/a/*.xml")); return bean.getObject(); } @Bean(name = "aTransactionManager") public DataSourceTransactionManager atTransactionManager(@Qualifier("aDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "aSqlSessionTemplate") public SqlSessionTemplate aSqlSessionTemplate(@Qualifier("aSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }
数据源B
@Configuration @MapperScan(basePackages = "com.example.mapper.b", sqlSessionTemplateRef = "bSqlSessionTemplate") public class DataSourceBConfig { @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Bean(name = "bDataSource") public DataSource bDataSource() throws SQLException { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setFilters("stat"); return dataSource; } @Bean(name = "bSqlSessionFactory") public SqlSessionFactory aSqlSessionFactory(@Qualifier("bDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); Properties properties = new Properties(); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "count=countSql"); properties.setProperty("reasonable", "false"); // 添加插件 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/b/*.xml")); return bean.getObject(); } @Bean(name = "bTransactionManager") public DataSourceTransactionManager atTransactionManager(@Qualifier("bDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "bSqlSessionTemplate") public SqlSessionTemplate aSqlSessionTemplate(@Qualifier("bSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }
通过这样配置后,a包下的mapper走aDatasource,b包下的mapper走bDatasource

浙公网安备 33010602011771号