如何使用SpringBoot2.0.7+MyBatis+DB+Durid實現多數據源項目

  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即可自動掃描。

 

  感謝大家關注,提前祝大家國慶快樂,工作順心,生活愉快!!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章