項目Git地址:SpringBoot 配置多數據源:Jacob-multi-data-source
- 準備工作
準備兩個數據庫(此模塊中兩個數據庫一個為本地 一個為遠程,本地為主,遠程為從)。然后建表。
#本地庫
CREATE TABLE `username` (`id` bigint(11) NOT NULL AUTO_INCREMENT,`username` varchar(255) NOT NULL,`password` varchar(255) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
#遠程庫
CREATE TABLE `user` (`id` bigint NOT NULL COMMENT '主鍵ID',`name` varchar(30) DEFAULT NULL COMMENT '姓名',`age` int DEFAULT NULL COMMENT '年齡',`email` varchar(50) DEFAULT NULL COMMENT '郵箱',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- 創建SpringBoot項目
最終目錄結構:
- 添加依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.0</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.1.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.18</version></dependency>
- 編寫配置文件
server:port: 8083swagger:enabled: truemybatis:mapper-locations: classpath:mapper/*/*.xml,classpath:mapper/*.xml
## 主數據源
master:package: cn.jacob.datasource.mapper.masterdatasource:url: jdbc:mysql://localhost:3306/tst?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTCusername: rootpassword:driverClassName: com.mysql.cj.jdbc.Driver
## 從數據源
cluster:datasource:url: jdbc:mysql://121.36.9.198:3306/local?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=UTCusername: rootpassword:driverClassName: com.mysql.cj.jdbc.Driver# -------------------------------------這一塊配置不加會導致項目啟動很慢-------------------------------------
# 連接池的配置信息
# 初始化大小,最小,最大
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourceinitialSize: 5minIdle: 5maxActive: 20# 配置獲取連接等待超時的時間maxWait: 60000# 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一個連接在池中最小生存的時間,單位是毫秒minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: false# 打開PSCache,并且指定每個連接上PSCache的大小poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20# 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻filters: stat,wall,log4j# 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# -------------------------------------------------------------------------------------------------------
- 編寫配置類
swagger配置類
@Configuration@EnableSwagger2public class SwaggerConfiguration {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("cn.jacob")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("swagger-bootstrap-ui RESTful APIs").description("swagger-bootstrap-ui").termsOfServiceUrl("http://localhost:8083/").contact("m15870979735@qq.com").version("1.0").build();}}
主數據源配置類
@Configuration//掃描 Mapper 接口并容器管理@MapperScan(basePackages = {"cn.jacob.datasource.mapper.master"}, sqlSessionFactoryRef = "masterSqlSessionFactory")public class MasterDataSourceConfig {// 精確到 master 目錄,以便跟其他數據源隔離static final String PACKAGE = "cn.jacob.datasource.mapper.master";static final String MAPPER_LOCATION = "classpath:mapper/**/*.xml";@Value("${master.datasource.url}")private String url;@Value("${master.datasource.username}")private String user;@Value("${master.datasource.password}")private String password;@Value("${master.datasource.driverClassName}")private String driverClass;@Primary@Bean(name = "masterDataSource")public DataSource masterDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driverClass);dataSource.setUrl(url);dataSource.setUsername(user);dataSource.setPassword(password);return dataSource;}@Bean(name = "masterTransactionManager")@Primarypublic DataSourceTransactionManager masterTransactionManager() {return new DataSourceTransactionManager(masterDataSource());}@Bean(name = "masterSqlSessionFactory")@Primarypublic SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(masterDataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));return sessionFactory.getObject();}}
從數據源配置類
@Configuration//掃描 Mapper 接口并容器管理@MapperScan(basePackages = {"cn.jacob.datasource.mapper.cluster"}, sqlSessionFactoryRef = "clusterSqlSessionFactory")public class ClusterDataSourceConfig {// 精確到 cluster 目錄,以便跟其他數據源隔離static final String PACKAGE = "cn.jacob.datasource.mapper.cluster";static final String MAPPER_LOCATION = "classpath:mapper/**/*.xml";@Value("${cluster.datasource.url}")private String url;@Value("${cluster.datasource.username}")private String user;@Value("${cluster.datasource.password}")private String password;@Value("${cluster.datasource.driverClassName}")private String driverClass;@Bean(name = "clusterDataSource")public DataSource clusterDataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driverClass);dataSource.setUrl(url);dataSource.setUsername(user);dataSource.setPassword(password);return dataSource;}@Bean(name = "clusterTransactionManager")public DataSourceTransactionManager clusterTransactionManager() {return new DataSourceTransactionManager(clusterDataSource());}@Bean(name = "clusterSqlSessionFactory")public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("clusterDataSource") DataSource clusterDataSource)throws Exception {final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(clusterDataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));return sessionFactory.getObject();}}
- 實體類,Dao層,Service層不再概括
- 控制層
便于區分創建兩個控制器
@RestController@Slf4j@Api(value = "主數據源", tags = "主數據源")@RequestMapping("/username")@AllArgsConstructorpublic class UsernameController {private UsernameService usernameService;@GetMapping("/getList")@ApiOperation(value = "用戶列表",notes = "用戶列表")public List<Username> getList(){return usernameService.getList();}}
-----------------------------------------------------------------------------------------------------------------@RestController@Slf4j@Api(value = "從數據源", tags = "從數據源")@RequestMapping("/user")@AllArgsConstructorpublic class UserController {private UserService userService;@GetMapping("/getList")@ApiOperation(value = "用戶列表",notes = "用戶列表")public List<User> getList(){return userService.getList();}}