Hello,大家好,我是Steafan,今天爲大家帶來多數據源環境的配置,親測可用,且配置相對網上其他教程的配置相對簡單。本片博文是使用yml配置源的方式來實現項目多數據源環境,請朋友們知曉。
一、配置依賴
<!-- SQL Server -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
<!-- druid數據源驅動 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
二、多數據源yml文件中的配置
spring:
# 配置多數據源
datasource:
#使用druid連接池
type: com.alibaba.druid.pool.DruidDataSource
# 配置主數據源,注意節點的位置
primary:
datasource:
#druid相關配置
druid:
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
url:
username:
password:
# 連接池配置
initial-size: 5
min-idle: 5
max-active: 20
# 連接等待超時時間
max-wait: 30000
# 配置檢測可以關閉的空閒連接間隔時間
time-between-eviction-runs-millis: 60000
# 配置連接在池中的最小生存時間
min-evictable-idle-time-millis: 300000
# validation-query: select '1' from dual
validation-query: SELECT 'x' #FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打開PSCache,並且指定每個連接上PSCache的大小
pool-prepared-statements: true
max-open-prepared-statements: 20
max-pool-prepared-statement-per-connection-size: 20
# 配置監控統計攔截的filters, 去掉後監控界面sql無法統計, 'wall'用於防火牆
filters: stat
# Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔
# aop-patterns: cn.servie.*
# WebStatFilter配置
web-stat-filter:
enabled: true
# 添加過濾規則
url-pattern: /*
# 忽略過濾的格式
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/actuator/*'
# StatViewServlet配置
stat-view-servlet:
enabled: true
# 訪問路徑爲/druid時,跳轉到StatViewServlet
url-pattern:
# 是否能夠重置數據
reset-enable: false
# 需要賬號密碼才能訪問控制檯
login-username:
login-password:
# IP白名單
# allow: 127.0.0.1
# IP黑名單(共同存在時,deny優先於allow)
# deny: 192.168.1.218
# 配置StatFilter
# filter:
# stat:
# log-slow-sql: true
# 配置從數據源(額外數據源),注意節點的位置
back:
datasource:
#druid相關配置
druid:
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
url:
username:
password:
# 連接池配置
initial-size: 5
min-idle: 5
max-active: 20
# 連接等待超時時間
max-wait: 30000
# 配置檢測可以關閉的空閒連接間隔時間
time-between-eviction-runs-millis: 60000
# 配置連接在池中的最小生存時間
min-evictable-idle-time-millis: 300000
# validation-query: select '1' from dual
validation-query: SELECT 'x' #FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打開PSCache,並且指定每個連接上PSCache的大小
pool-prepared-statements: true
max-open-prepared-statements: 20
max-pool-prepared-statement-per-connection-size: 20
#監控統計攔截的filters
filters: stat
# 配置監控統計攔截的filters, 去掉後監控界面sql無法統計, 'wall'用於防火牆
# Spring監控AOP切入點,如x.y.z.service.*,配置多個英文逗號分隔
# aop-patterns: cn.servie.*
# WebStatFilter配置
web-stat-filter:
enabled: true
# 添加過濾規則
url-pattern: /*
# 忽略過濾的格式
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/actuator/*'
# StatViewServlet配置
stat-view-servlet:
enabled: true
# 訪問路徑爲/druid時,跳轉到StatViewServlet
url-pattern:
# 是否能夠重置數據
reset-enable: false
# 需要賬號密碼才能訪問控制檯
login-username:
login-password:
# IP白名單
# allow: 127.0.0.1
# IP黑名單(共同存在時,deny優先於allow)
# deny: 192.168.1.218
# 配置StatFilter
# filter:
# stat:
# log-slow-sql: true
# druid:
# # 數據庫訪問配置, 使用druid數據源
# db-type: com.alibaba.druid.pool.DruidDataSource
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url:
# username:
# password:
#mybatis:
# config-location: classpath:config/mybatis-config.xml
# # type-aliases掃描路徑
# type-aliases-package:
# # mapper xml實現掃描路徑
# mapper-locations: classpath:mapper/*.xml
# property:
# order: BEFORE
# # 開啓駝峯自動轉換
## configuration:
## map-underscore-to-camel-case: true
##mappers 多個接口時逗號隔開
#mapper:
# mappers:
# not-empty: false
# identity: SQLSERVER
# order: after
#pagehelper
#pagehelper:
# helperDialect: sqlserver
# reasonable: true
# supportMethodsArguments: true
# params: count=countSql
注意: StatFilter、Durid、mybatis、mappers、pagehelper這些不需要再單獨額外的進行配置
三、在項目中新建config配置文件包,並在其中創建多個數據源的配置類
1、配置主數據源(注意各配置類所引入的包)
@Data
@Configuration
// 前綴爲primary.datasource.druid的配置信息
@ConfigurationProperties(prefix = "primary.datasource.druid")
@MapperScan(basePackages = PrimaryDataBaseConfig.PACKAGE, sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataBaseConfig {
/**
* dao層的包路徑
*/
static final String PACKAGE = "你的路徑";
/**
* mapper文件的相對路徑
*/
private static final String MAPPER_LOCATION = "你的路徑";
private String filters;
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private long maxWait;
private long timeBetweenEvictionRunsMillis;
private long minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
// 主數據源使用@Primary註解進行標識
@Primary
@Bean(name = "primaryDataSource")
public DataSource primaryDataSource() throws SQLException {
DruidDataSource druid = new DruidDataSource();
// 監控統計攔截的filters
druid.setFilters(filters);
// 配置基本屬性
druid.setDriverClassName(driverClassName);
druid.setUsername(username);
druid.setPassword(password);
druid.setUrl(url);
//初始化時建立物理連接的個數
druid.setInitialSize(initialSize);
//最大連接池數量
druid.setMaxActive(maxActive);
//最小連接池數量
druid.setMinIdle(minIdle);
//獲取連接時最大等待時間,單位毫秒。
druid.setMaxWait(maxWait);
//間隔多久進行一次檢測,檢測需要關閉的空閒連接
druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
//一個連接在池中最小生存的時間
druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
//用來檢測連接是否有效的sql
druid.setValidationQuery(validationQuery);
//建議配置爲true,不影響性能,並且保證安全性。
druid.setTestWhileIdle(testWhileIdle);
//申請連接時執行validationQuery檢測連接是否有效
druid.setTestOnBorrow(testOnBorrow);
druid.setTestOnReturn(testOnReturn);
//是否緩存preparedStatement,也就是PSCache,oracle設爲true,mysql設爲false。分庫分表較多推薦設置爲false
druid.setPoolPreparedStatements(poolPreparedStatements);
// 打開PSCache時,指定每個連接上PSCache的大小
druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
return druid;
}
// 創建該數據源的事務管理
@Primary
@Bean(name = "primaryTransactionManager")
public DataSourceTransactionManager primaryTransactionManager() throws SQLException {
return new DataSourceTransactionManager(primaryDataSource());
}
// 創建Mybatis的連接會話工廠實例
@Primary
@Bean(name = "primarySqlSessionFactory")
public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource primaryDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(primaryDataSource); // 設置數據源bean
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(PrimaryDataBaseConfig.MAPPER_LOCATION)); // 設置mapper文件路徑
return sessionFactory.getObject();
}
}
2、配置從數據源(額外數據源)(注意各配置類所引入的包)
@Data
@Configuration
@ConfigurationProperties(prefix = "back.datasource.druid")
@MapperScan(basePackages = BackDataBaseConfig.PACKAGE, sqlSessionFactoryRef = "backSqlSessionFactory")
public class BackDataBaseConfig {
/**
* dao層的包路徑
*/
static final String PACKAGE = "你的路徑";
/**
* mapper文件的相對路徑
*/
private static final String MAPPER_LOCATION = "你的路徑";
private String filters;
private String url;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private long maxWait;
private long timeBetweenEvictionRunsMillis;
private long minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
@Bean(name = "backDataSource")
public DataSource backDataSource() throws SQLException {
DruidDataSource druid = new DruidDataSource();
// 監控統計攔截的filters
druid.setFilters(filters);
// 配置基本屬性
druid.setDriverClassName(driverClassName);
druid.setUsername(username);
druid.setPassword(password);
druid.setUrl(url);
//初始化時建立物理連接的個數
druid.setInitialSize(initialSize);
//最大連接池數量
druid.setMaxActive(maxActive);
//最小連接池數量
druid.setMinIdle(minIdle);
//獲取連接時最大等待時間,單位毫秒。
druid.setMaxWait(maxWait);
//間隔多久進行一次檢測,檢測需要關閉的空閒連接
druid.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
//一個連接在池中最小生存的時間
druid.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
//用來檢測連接是否有效的sql
druid.setValidationQuery(validationQuery);
//建議配置爲true,不影響性能,並且保證安全性。
druid.setTestWhileIdle(testWhileIdle);
//申請連接時執行validationQuery檢測連接是否有效
druid.setTestOnBorrow(testOnBorrow);
druid.setTestOnReturn(testOnReturn);
//是否緩存preparedStatement,也就是PSCache,oracle設爲true,mysql設爲false。分庫分表較多推薦設置爲false
druid.setPoolPreparedStatements(poolPreparedStatements);
// 打開PSCache時,指定每個連接上PSCache的大小
druid.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
return druid;
}
@Bean(name = "backTransactionManager")
public DataSourceTransactionManager backTransactionManager() throws SQLException {
return new DataSourceTransactionManager(backDataSource());
}
@Bean(name = "backSqlSessionFactory")
public SqlSessionFactory backSqlSessionFactory(@Qualifier("backDataSource") DataSource backDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(backDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(BackDataBaseConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
}
注意:
1、@ConfigurationProperties註解會和yml配置源中配置的primary、back等自定義的標籤節點進行綁定,即在yml中使用自定義的配置節點來配置項目。
2、各數據源配置類中需要注意mapperLocation的配置位置和配置方法,路徑一定要正確。
四、配置多數據源中需要注意的地方
1、使用多數據源需要在項目中區分不同的dao層,即mapper的實現層interface,不同dao層要在不同的dao層包中,這樣纔行
2、使用多數據源需要在項目中新建不同的dao層所對應的xml的實現文件夾,分開建立纔行
3、一些實體類pojo層,service層及實現,controller層不需要單獨再新建包來區分。
4、在多數據源環境下,寫sql或操作dao層mapper時,在指定表名時,直接指定就可以,不需要有多餘的配置,因爲在配置多數據源的配置類中以及yml文件中已經指名了不同數據源,springboot會根據yml文件中的多數據源配置來自動掃描不同的配置源,從而去匹配項目中不同的數據表。
5、springboot使用yml的方式去配置數據源,必須指名主數據源,即一定要加@Primary註解來聲明主數據源是哪個配置類,其他非主數據源不需要添加(也不需要添加其他額外的註解),否則springboot無法掃描多數據源配置,從而在項目啓動時發生錯誤。
6、如果還需要添加其他數據源,則只需要在yml中再指定一個額外的數據源節點,然後再新建一個數據源配置類即可,springboot即可自動掃描。
感謝大家關注,提前祝大家國慶快樂,工作順心,生活愉快!!!!!!