1. 程式人生 > >spring boot中使用druid多資料來源配置Mybatis

spring boot中使用druid多資料來源配置Mybatis

首選必須吐槽下,不知道是我讀書太少,還是Spring boot確實對druid和mybatis的支援不好,奈何用怪了druid的資料庫、sql、url監控和mybatis資料來源,只有硬著頭皮上了。

相關配置

常例先給出build.gradle配置

"org.mybatis.spring.boot:mybatis-spring-boot-starter:1.2.0",
"mysql:mysql-connector-java:5.1.38",
"com.alibaba:druid:1.0.26"

druid的相關配置(雖然是放在預設配置中,但壓根就不會自動載入)

spring.datasource
.type=com.alibaba.druid.pool.DruidDataSource # 下面為連線池的補充設定,應用到上面所有資料來源中 # 初始化大小,最小,最大 spring.datasource.initialSize=8 spring.datasource.minIdle=1 spring.datasource.maxActive=20 # 配置獲取連線等待超時的時間 spring.datasource.maxWait=60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis
=60000 # 配置一個連線在池中最小生存的時間,單位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # 開啟PSCache,並且指定每個連線上PSCache的大小 spring.datasource.poolPreparedStatements
=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆 spring.datasource.filters=stat, wall

接著是兩個資料來源配置

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://ip1:3306/springboot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=xxxx
spring.datasource.password=xxxx

spring.datasource.siva.url=jdbc:mysql://ip2:3306/siva?useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.siva.username=xxx
spring.datasource.siva.password=xxx

druid的Servlet及攔截器

由於不存在web.xml檔案,需要在java程式碼中進行配置

@Bean
public ServletRegistrationBean druidServlet() {
    ServletRegistrationBean reg = new ServletRegistrationBean();
    reg.setServlet(new StatViewServlet());
    reg.addUrlMappings("/druid/*");
    reg.addInitParameter("loginUsername", "sivannnn");
    reg.addInitParameter("loginPassword", "123456");
    return reg;
}

@Bean
public FilterRegistrationBean filterRegistrationBean() {
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(new WebStatFilter());
    filterRegistrationBean.addUrlPatterns("/*");
    filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
    filterRegistrationBean.addInitParameter("profileEnable", "true");
    filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE");
    filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION");
    return filterRegistrationBean;
}

資料來源配置

採用多資料來源的情況下,要求必須有一個數據源為”主”.

...引數已經略去
@Bean(name = "rdsDataSource")
@Primary
public DataSource rdsDataSource() {
    DruidDataSource datasource = new DruidDataSource();
    datasource.setUrl(this.dbUrl);
    datasource.setUsername(username);
    datasource.setPassword(password);
    datasource.setDriverClassName(driverClassName);
    datasource.setInitialSize(initialSize);
    datasource.setMinIdle(minIdle);
    datasource.setMaxActive(maxActive);
    datasource.setMaxWait(maxWait);
     datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
    datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
    datasource.setValidationQuery(validationQuery);
    datasource.setTestWhileIdle(testWhileIdle);
    datasource.setTestOnBorrow(testOnBorrow);
    datasource.setTestOnReturn(testOnReturn);
    datasource.setPoolPreparedStatements(poolPreparedStatements);
    try {
        datasource.setFilters(filters);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return datasource;
 }

@Bean(name = "rdsTransactionManager")
@Primary
public DataSourceTransactionManager rdsTransactionManager() {
    return new DataSourceTransactionManager(rdsDataSource());
}

@Bean(name = "rdsSqlSessionFactory")
@Primary
public SqlSessionFactory rdsSqlSessionFactory(@Qualifier("rdsDataSource") DataSource rdsDataSource)
        throws Exception {
    final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(rdsDataSource);
    return sessionFactory.getObject();
}

其中rdsDataSource函式中對引數,即對druid對配置,採用@value註解從配置檔案中引用。
@Primary註解即表示該資料來源為預設資料來源(主資料來源)
其餘資料來源除了沒有@primary註解,配置方式相同。@bean不能重複,否則會預設忽略第二個相同註解。

這裡很重要

最後經過單元測試
1.兩個資料來源都能進行資料庫操作。
2.非預設資料來源無法進行事物處理,就算使用@Transactional註解選擇事物bean,也沒法,對此我很懵逼!!!
跪求大神解惑