Springboot druid 多資料來源
阿新 • • 發佈:2022-03-30
目錄結構
結構
修改配置
pom
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.20</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency>
修改application.yml配置
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource # Druid連線池配置 druid: # 初始化大小,最小,最大 initial-size: 5 max-active: 30 min-idle: 5 # 獲取資料庫連線等待的超時時間 max-wait: 3000 max-open-prepared-statements: -1 # 配置多久進行一次檢測,檢測需要關閉的空閒連線 單位毫秒 time-between-eviction-runs-millis: 60000 # 配置連線在池中的最小生存時間 min-evictable-idle-time-millis: 300000 # 配置連線在池中的最大生存時間 max-evictable-idle-time-millis: 400000 # 系統啟動時通過該sql語句驗證資料庫是否可用,如果不配置validationQuery,則下面三項無效 validation-query: SELECT 1 # 啟用空閒連線檢測,以便回收 test-while-idle: true # 從連線池獲取連線時,是否檢測連線可用性,開啟效能會有些許影響 test-on-borrow: false # 釋放連線到連線池時,是否檢測連線可用性,開啟效能會有些許影響 test-on-return: false # 開啟PSCache,並且指定每個連線上PSCache的大小 pool-prepared-statements: false max-pool-prepared-statement-per-connection-size: 20 # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆 filters: stat,wall use-global-data-source-stat: true # 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄 connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 server: port: 7080 mybatis: # 對應實體類的包名 type-aliases-package: com.example.druiddemo.dao mapper-locations: classpath:mybatis/mapper/*.xml # config-location: classpath:mybatis/mybatis-config.xml mfw: datasource: username: root password: 123456 url: jdbc:mysql://127.0.0.1:3306/mfw?characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver komo: datasource: username: root password: 123456 url: jdbc:mysql://127.0.0.1:3306/komo?characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver
修改config目錄下的配置
KomoDataSourceConfig.java
package com.example.druiddemo.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; 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; /** * @author [email protected] * @date 2020-05-12 18:41 */ @Configuration @MapperScan(basePackages = KomoDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "komoSqlSessionFactory") public class KomoDataSourceConfig { /** * 配置多資料來源 關鍵就在這裡 這裡配置了不同的資料來源掃描不同mapper */ static final String PACKAGE = "com.example.druiddemo.mapper.komo"; static final String MAPPER_LOCATION = "classpath:mybatis/komo/mapper/*.xml"; /** * 連線資料庫資訊 這個其實更好的是用配置中心完成 */ @Value("${komo.datasource.url}") private String url; @Value("${komo.datasource.username}") private String username; @Value("${komo.datasource.password}") private String password; @Value("${komo.datasource.driver-class-name}") private String driverClassName; @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*"); // IP白名單 servletRegistrationBean.addInitParameter("allow", "127.0.0.1"); // IP黑名單(共同存在時,deny優先於allow) // servletRegistrationBean.addInitParameter("deny", "192.168.1.100"); //控制檯管理使用者 servletRegistrationBean.addInitParameter("loginUsername", "admin"); servletRegistrationBean.addInitParameter("loginPassword", "admin"); //是否能夠重置資料 禁用HTML頁面上的“Reset All”功能 servletRegistrationBean.addInitParameter("resetEnable", "false"); return servletRegistrationBean; } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } // 註解@Primary表示是主資料來源 @Bean("komoDataSource") @Primary public DataSource komoDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName(driverClassName); return dataSource; } @Bean(name = "komoTransactionManager") @Primary public DataSourceTransactionManager masterTransactionManager() { return new DataSourceTransactionManager(komoDataSource()); } @Bean(name = "komoSqlSessionFactory") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("komoDataSource") DataSource masterDataSource) throws Exception { //如果使用mybatis或mybatis plus 的話需要使用這個bean工廠管理器,否則會無法使用mybatis或mybatis puls框架提供的基礎方法 final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean(); //final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(masterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(KomoDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }
MfwDataSourceConfig.java
package com.example.druiddemo.config;
import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
/**
* @author [email protected]
* @date 2020-05-12 18:41
*/
@Configuration
@MapperScan(basePackages = MfwDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "mfwSqlSessionFactory")
public class MfwDataSourceConfig {
/**
* 配置多資料來源 關鍵就在這裡 這裡配置了不同的資料來源掃描不同mapper
*/
static final String PACKAGE = "com.example.druiddemo.mapper.mfw";
static final String MAPPER_LOCATION = "classpath:mybatis/mfw/mapper/*.xml";
/**
* 連線資料庫資訊 這個其實更好的是用配置中心完成
*/
@Value("${mfw.datasource.url}")
private String url;
@Value("${mfw.datasource.username}")
private String username;
@Value("${mfw.datasource.password}")
private String password;
@Value("${mfw.datasource.driver-class-name}")
private String driverClassName;
@Bean("mfwDataSource")
public DataSource mfwDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
@Bean(name = "mfwTransactionManager")
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(mfwDataSource());
}
@Bean(name = "mfwSqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("mfwDataSource") DataSource masterDataSource)
throws Exception {
//如果使用mybatis或mybatis plus 的話需要使用這個bean工廠管理器,否則會無法使用mybatis或mybatis puls框架提供的基礎方法
final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
//final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MfwDataSourceConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
UserController.java
package com.example.druiddemo.controller;
import com.example.druiddemo.common.PageDTO;
import com.example.druiddemo.dao.komo.User;
import com.example.druiddemo.dao.mfw.BaseUser;
import com.example.druiddemo.service.BaseUserService;
import com.example.druiddemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author [email protected]
* @date 2020-04-30 18:47
*/
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
private UserService userService;
@Autowired
private BaseUserService baseUserService;
@GetMapping("/one")
public User getOne(@RequestParam("id") Integer id){
return userService.getOne(id);
}
@GetMapping("/list")
public PageDTO<User> getList(@RequestParam(value = "page",defaultValue = "1") Integer page,
@RequestParam(value = "limit",defaultValue = "10") Integer limit){
return userService.getList(page,limit);
}
@GetMapping("/base")
public BaseUser getBase(@RequestParam("id") Integer id){
return baseUserService.getOne(id);
}
}
啟動類Application修改
package com.example.druiddemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
// 去掉自動資料庫自動配置類
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DruidDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DruidDemoApplication.class, args);
System.out.println("============= druid-demo application start =============");
}
}