springboot中使用Druid

Druid是一個JDBC組件,它包括三部分:

1.DruidDriver 代理Driver,能夠提供基于Filter-Chain模式的插件體系。
2.DruidDataSource 高效可管理的數據庫連接池。
3.SQLParser

Druid可以做什么

1.可以監(jiān)控數據庫訪問性能,Druid內置提供了一個功能強大的StatFilter插件,能夠詳細統(tǒng)計SQL的執(zhí)行性能,這對于線上分析數據庫訪問性能有幫助。
2.替換DBCPC3P0。Druid提供了一個高效、功能強大、可擴展性好的數據庫連接池。
3.數據庫密碼加密。直接把數據庫密碼寫在配置文件中,這是不好的行為,容易導致安全問題。DruidDruiverDruidDataSource都支持PasswordCallback。
4.SQL執(zhí)行日志,Druid提供了不同的LogFilter,能夠支持Common-Logging、Log4jJdkLog,你可以按需要選擇相應的LogFilter,監(jiān)控你應用的數據庫訪問情況。
擴展JDBC,如果你要對JDBC層有編程的需求,可以通過Druid提供的Filter-Chain機制,很方便編寫JDBC層的擴展插件。

Springboot中的連接池

目前Spring Boot中默認支持的連接池有dbcp,dbcp2, tomcat, hikariCP。
Druid連接池可以通過定制化DataSource來實現

功能 dbcp druid c3p0 tomcat-jdbc HikariCP
是否支持PSCache
監(jiān)控 jmx jmx/log/http jmx,log jmx jmx
擴展性
sql攔截及解析 支持
代碼 簡單 中等 復雜 簡單 簡單
特點 依賴于common-pool 阿里開源,功能全面 歷史久遠,代碼邏輯復雜,且不易維護 優(yōu)化力度大,功能簡單,起源于boneCP
連接池管理 LinkedBlockingDeque 數組 FairBlockingQueue threadlocal+CopyOnWriteArrayList

更多詳細的介紹可以參考http://www.iteye.com/magazines/90
開發(fā)文檔地址:http://tool.oschina.net/apidocs/apidoc?api=druid0.26

屬性(Parameter) 默認值(Default) 描述(Description)
username 連接數據庫的用戶名
password 連接數據庫的密碼
jdbcUrl 同DBCP中的jdbcUrl屬性
driverClassName 根據url自動識別 這一項可配可不配,如果不配置druid會根據url自動識別dbType,然后選擇相應的driverClassName
initialSize 0 初始化時建立物理連接的個數。初始化發(fā)生在顯示調用init方法,或者第一次getConnection時 初始化連接:連接池啟動時創(chuàng)建的初始化連接數量
maxActive 8 最大連接池數量(Maximum number of Connections a pool will maintain at any given time.) *參見DBCP中的maxTotal屬性
maxIdle 8 已經不再使用,配置了也沒效果 *參見DBCP中的maxIdle屬性
minIdle 最小連接池數量
maxWait 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
poolPreparedState- ments false 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle。
maxOpenPrepared- Statements -1 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發(fā)修改為true。 在Druid中,不會存在Oracle下PSCache占用內存過多的問題,可以把這個數值配置大一些,比如說100
testOnBorrow true 申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testOnReturn false 歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能
testWhileIdle false 建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。
validationQuery 用來檢測連接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、 testWhileIdle都不會其作用。在mysql中通常為select 'x',在oracle中通常為select 1 from dual
timeBetweenEviction-RunsMillis 1) Destroy線程會檢測連接的間隔時間 2) testWhileIdle的判斷依據
minEvictableIdle- TimeMillis Destory線程中如果檢測到當前連接的最后活躍時間和當前時間的差值大于minEvictableIdleTimeMillis,則關閉當前連接。
removeAbandoned 對于建立時間超過removeAbandonedTimeout的連接強制關閉
removeAbandoned-Timeout 指定連接建立多長時間就需要被強制關閉
logAbandoned false 指定發(fā)生removeabandoned的時候,是否記錄當前線程的堆棧信息到日志中
filters 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 1)監(jiān)控統(tǒng)計用的filter:stat 2)日志用的filter:log4j 3)防御sql注入的filter:wall

在springboot中使用Druid的話首先第一步肯定是先引入依賴
版本1.0.29((Mar 14, 2017))

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.29</version>
</dependency>

由于Druid暫時不在Spring Boot中的直接支持,故需要進行配置信息的定制

1.把配置信息寫在yml配置文件中

spring:
    # DATASOURCE
    datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/所用到的數據庫名?useUnicode=true&characterEncoding=utf-8
        username: mysql數據庫用戶名
        password: mysql數據庫密碼
        type: com.alibaba.druid.pool.DruidDataSource
        initialSize: 5
        minIdle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,wall,log4j
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        useGlobalDataSourceStat: true

2.配置數據源。

@ConfigurationProperties會把配置文件的參數自動賦值到dataSource里
druidStatViewServlet()配置監(jiān)控界面
druidWebStatViewFilter()編寫過濾器,配合druid監(jiān)控的使用

@Configuration
public class DruidConfiguration {
    private Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
    @Bean
    public ServletRegistrationBean druidStatViewServlet() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        registrationBean.addInitParameter("allow", "127.0.0.1");// IP白名單 (沒有配置或者為空,則允許所有訪問)
        registrationBean.addInitParameter("deny", "");// IP黑名單 (存在共同時,deny優(yōu)先于allow)
        registrationBean.addInitParameter("loginUsername", "登錄druid的用戶名");
        registrationBean.addInitParameter("loginPassword", "登錄druid的密碼");
        registrationBean.addInitParameter("resetEnable", "false");
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean druidWebStatViewFilter() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new WebStatFilter());
        registrationBean.addInitParameter("urlPatterns", "/*");
        registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*");
        return registrationBean;
    }
}

在注入的兩個bean中,一個是StatViewServlet(),一個是WebStatFilter()

StatViewServlet是一個標準的javax.servlet.http.HttpServlet

1.配置url-pattern
根據配置中的url-pattern來訪問內置監(jiān)控頁面,如果是上面的配置/druid/*,內置監(jiān)控頁面的首頁是/druid/index.html
2配置allow和deny
判斷規(guī)則:
deny優(yōu)先于allow,如果在deny列表中,就算在allow列表中,也會被拒絕。
如果allow沒有配置或者為空,則允許所有訪問
其中
128.242.127.1/24
24表示,前面24位是子網掩碼,比對的時候,前面24位相同就匹配。
不支持IPV6
由于匹配規(guī)則不支持IPV6,配置了allow或者deny之后,會導致IPV6無法訪問。
3.配置resetEnable
StatViewSerlvet輸出的html頁面中,有一個功能是Reset All,執(zhí)行這個操作之后,會導致所有計數器清零,重新計數。你可以通過配置參數關閉它。

WebStatFilter用于采集web-jdbc關聯(lián)監(jiān)控的數據。

exlusions配置
經常需要排除一些不必要的url,比如js,css等等。配置在init-param中。

啟動項目后訪問http://localhost:8080/druid/index.html 登錄后
即可查看數據源及SQL統(tǒng)計等。

Paste_Image.png

如果是被denyIP 127.0.0.1登錄druid是這樣的,但是換成localhost的話是可以的

Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容