springboot中使用Druid

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

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

Druid可以做什么

1.可以監(jiān)控數(shù)據(jù)庫訪問性能挠日,Druid內(nèi)置提供了一個功能強大的StatFilter插件疮绷,能夠詳細統(tǒng)計SQL的執(zhí)行性能,這對于線上分析數(shù)據(jù)庫訪問性能有幫助嚣潜。
2.替換DBCPC3P0冬骚。Druid提供了一個高效、功能強大懂算、可擴展性好的數(shù)據(jù)庫連接池只冻。
3.數(shù)據(jù)庫密碼加密。直接把數(shù)據(jù)庫密碼寫在配置文件中计技,這是不好的行為喜德,容易導(dǎo)致安全問題。DruidDruiverDruidDataSource都支持PasswordCallback垮媒。
4.SQL執(zhí)行日志舍悯,Druid提供了不同的LogFilter,能夠支持Common-Logging涣澡、Log4jJdkLog贱呐,你可以按需要選擇相應(yīng)的LogFilter丧诺,監(jiān)控你應(yīng)用的數(shù)據(jù)庫訪問情況入桂。
擴展JDBC,如果你要對JDBC層有編程的需求驳阎,可以通過Druid提供的Filter-Chain機制抗愁,很方便編寫JDBC層的擴展插件馁蒂。

Springboot中的連接池

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

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

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

屬性(Parameter) 默認值(Default) 描述(Description)
username 連接數(shù)據(jù)庫的用戶名
password 連接數(shù)據(jù)庫的密碼
jdbcUrl 同DBCP中的jdbcUrl屬性
driverClassName 根據(jù)url自動識別 這一項可配可不配,如果不配置druid會根據(jù)url自動識別dbType芯急,然后選擇相應(yīng)的driverClassName
initialSize 0 初始化時建立物理連接的個數(shù)勺届。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時 初始化連接:連接池啟動時創(chuàng)建的初始化連接數(shù)量
maxActive 8 最大連接池數(shù)量(Maximum number of Connections a pool will maintain at any given time.) *參見DBCP中的maxTotal屬性
maxIdle 8 已經(jīng)不再使用娶耍,配置了也沒效果 *參見DBCP中的maxIdle屬性
minIdle 最小連接池數(shù)量
maxWait 獲取連接時最大等待時間免姿,單位毫秒。配置了maxWait之后榕酒,缺省啟用公平鎖胚膊,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖想鹰。
poolPreparedState- ments false 是否緩存preparedStatement紊婉,也就是PSCache。PSCache對支持游標的數(shù)據(jù)庫性能提升巨大辑舷,比如說oracle肩榕。
maxOpenPrepared- Statements -1 要啟用PSCache,必須配置大于0惩妇,當(dāng)大于0時株汉,poolPreparedStatements自動觸發(fā)修改為true。 在Druid中歌殃,不會存在Oracle下PSCache占用內(nèi)存過多的問題乔妈,可以把這個數(shù)值配置大一些,比如說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的判斷依據(jù)
minEvictableIdle- TimeMillis Destory線程中如果檢測到當(dāng)前連接的最后活躍時間和當(dāng)前時間的差值大于minEvictableIdleTimeMillis呐籽,則關(guān)閉當(dāng)前連接锋勺。
removeAbandoned 對于建立時間超過removeAbandonedTimeout的連接強制關(guān)閉
removeAbandoned-Timeout 指定連接建立多長時間就需要被強制關(guān)閉
logAbandoned false 指定發(fā)生removeabandoned的時候,是否記錄當(dāng)前線程的堆棧信息到日志中
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/所用到的數(shù)據(jù)庫名?useUnicode=true&characterEncoding=utf-8
        username: mysql數(shù)據(jù)庫用戶名
        password: mysql數(shù)據(jù)庫密碼
        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.配置數(shù)據(jù)源牢酵。

@ConfigurationProperties會把配置文件的參數(shù)自動賦值到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
根據(jù)配置中的url-pattern來訪問內(nèi)置監(jiān)控頁面丝格,如果是上面的配置/druid/*撑瞧,內(nèi)置監(jiān)控頁面的首頁是/druid/index.html
2配置allow和deny
判斷規(guī)則:
deny優(yōu)先于allow,如果在deny列表中显蝌,就算在allow列表中预伺,也會被拒絕。
如果allow沒有配置或者為空曼尊,則允許所有訪問
其中
128.242.127.1/24
24表示酬诀,前面24位是子網(wǎng)掩碼,比對的時候骆撇,前面24位相同就匹配瞒御。
不支持IPV6
由于匹配規(guī)則不支持IPV6,配置了allow或者deny之后神郊,會導(dǎo)致IPV6無法訪問肴裙。
3.配置resetEnable
StatViewSerlvet輸出的html頁面中,有一個功能是Reset All涌乳,執(zhí)行這個操作之后蜻懦,會導(dǎo)致所有計數(shù)器清零,重新計數(shù)夕晓。你可以通過配置參數(shù)關(guān)閉它宛乃。

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

exlusions配置
經(jīng)常需要排除一些不必要的url,比如js,css等等烤惊。配置在init-param中乔煞。

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

Paste_Image.png

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

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逗宜,隨后出現(xiàn)的幾起案子雄右,更是在濱河造成了極大的恐慌,老刑警劉巖纺讲,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擂仍,死亡現(xiàn)場離奇詭異,居然都是意外死亡熬甚,警方通過查閱死者的電腦和手機逢渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乡括,“玉大人肃廓,你說我怎么就攤上這事』迕冢” “怎么了盲赊?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長敷扫。 經(jīng)常有香客問我哀蘑,道長,這世上最難降的妖魔是什么葵第? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任绘迁,我火速辦了婚禮,結(jié)果婚禮上卒密,老公的妹妹穿的比我還像新娘脊髓。我一直安慰自己,他們只是感情好栅受,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布将硝。 她就那樣靜靜地躺著,像睡著了一般屏镊。 火紅的嫁衣襯著肌膚如雪依疼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天而芥,我揣著相機與錄音律罢,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛误辑,可吹牛的內(nèi)容都是我干的沧踏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巾钉,長吁一口氣:“原來是場噩夢啊……” “哼翘狱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砰苍,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤潦匈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赚导,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茬缩,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年吼旧,在試婚紗的時候發(fā)現(xiàn)自己被綠了凰锡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡圈暗,死狀恐怖掂为,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厂置,我是刑警寧澤菩掏,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站昵济,受9級特大地震影響智绸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜访忿,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一瞧栗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧海铆,春花似錦迹恐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至珍语,卻和暖如春锤岸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背板乙。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工是偷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓蛋铆,卻偏偏與公主長得像馋评,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刺啦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容