1. 程式人生 > >Spring Boot 配置Druid資料來源

Spring Boot 配置Druid資料來源

Druid是阿里巴巴開源平臺上的一個專案,整個專案由資料庫連線池、外掛框架和SQL解析器組成。

新增Druid資料來源

要使用Druid資料來源,我們需要在 application.properties 下新增配置資訊

#資料庫訪問配置
#mysql
#spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/blog
#oracle
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
spring.datasource.username=system
spring.datasource.password=123456

#連線池配置
spring.datasource.initialSize=5
spring.datasource.minIdle=5
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,log4j
# 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

上面提供了mysql和oracle兩種資料庫驅動的配置,由於maven中心倉庫不提供oracle驅動,需要到oracle官網自行下載你自己版本需要的oracle資料庫驅動,再安裝到本地倉庫。我這裡用的eclipse自帶的maven,安裝oracle資料庫驅動到本地倉庫是直接建個資料夾丟進去重命下名的,簡單粗暴。

參考:jar包放com/oracle/ojdbc6/10.2.0.1.0 資料夾下,命名ojdbc6-10.2.0.1.0.jar

<dependency>
   <groupId>com.oracle</groupId>
   <artifactId>
ojdbc6</artifactId> <version>${ojdbc6.version}</version> </dependency>

此外,在本版本(1.5.2)的Spring Boot 中,對於上面Druid連線池的配置都不支援,意味著這些配置屬性不會生效,所以,需要些一個配置類來讀取這些配置並設定到資料來源中去

package com.fyft.wx.config;

import java.sql.SQLException;
import javax.sql.DataSource;
import org.slf4j.Logger;
import
org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import com.alibaba.druid.pool.DruidDataSource; /** *<p>Title: DruidDataSourceConfig.java</p> *<p>Description: 資料來源屬性配置</p> *<p>CreateDate: 2017年5月18日</p> *@author shen *@version v1.0 */ @Configuration @Primary //在同樣的DataSource中,首先使用被標註的DataSource public class DruidDataSourceConfig extends DataSourceProperties{ private Logger logger = LoggerFactory.getLogger(DruidDataSourceConfig.class); @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; @Value("${spring.datasource.filters}") private String filters; @Value("{spring.datasource.connectionProperties}") private String connectionProperties; @Bean //宣告其為Bean例項 public DataSource dataSource(){ DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); //configuration 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); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { datasource.setFilters(filters); } catch (SQLException e) { logger.error("druid configuration initialization filter", e); } datasource.setConnectionProperties(connectionProperties); return datasource; } }

本段配置參考自 http://blog.csdn.net/blueheart20/article/details/52384032
其中 @Primary 註解需要放在類上,不然本類配置還是不會覆蓋預設的資料來源配置,原作者是放在 public DataSource dataSource() 方法上,會報存在兩個配置的錯誤,估計是Spring Boot版本的差異問題。

配置監控統計功能

新建一個配置類

package com.fyft.wx.config;

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 com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

/**
 *<p>Title: DruidConfiguration.java</p>
 *<p>Description: Druid監控配置</p>
 *<p>CreateDate: 2017年5月3日</p>
 *@author shen
 *@version v1.0
 */

@Configuration
public class DruidMonitorConfig {

    /**
     * 註冊ServletRegistrationBean
     * @return
     */
    @Bean
    public ServletRegistrationBean registrationBean() {
        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        /** 初始化引數配置,initParams**/
        //白名單
        bean.addInitParameter("allow", "127.0.0.1");//多個ip逗號隔開
        //IP黑名單 (存在共同時,deny優先於allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
        //bean.addInitParameter("deny", "192.168.1.73");
        //登入檢視資訊的賬號密碼.
        bean.addInitParameter("loginUsername", "admin");
        bean.addInitParameter("loginPassword", "123456");
        //是否能夠重置資料.
        bean.addInitParameter("resetEnable", "false");
        return bean;
    }

    /**
     * 註冊FilterRegistrationBean
     * @return
     */
    @Bean
    public FilterRegistrationBean druidStatFilter() {
        FilterRegistrationBean bean = new FilterRegistrationBean(new WebStatFilter());
        //新增過濾規則.
        bean.addUrlPatterns("/*");
        //新增不需要忽略的格式資訊.
        bean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return bean;
    }

}

啟動專案後訪問 ip:埠/druid 輸入配置類設定的賬號密碼進入監控後臺。我們先執行一個數據庫操作,可以在sql監控選項卡看到執行的sql
這裡寫圖片描述

檢視資料來源選項卡可以看到配置連線池引數也都生效了
這裡寫圖片描述