日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

$cfg_dbtype = mysql_Druid连接池二(学习笔记)

發(fā)布時(shí)間:2025/4/16 数据库 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 $cfg_dbtype = mysql_Druid连接池二(学习笔记) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

6.Druid關(guān)聯(lián)

6.1.Web關(guān)聯(lián)監(jiān)控配置

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

web.xml配置:

DruidWebStatFiltercom.alibaba.druid.support.http.WebStatFilterexclusions*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*DruidWebStatFilter/*

exlusions配置

經(jīng)常需要排除一些不必要的url,比如.js,/jslib/等等。配置在init-param中。比如:

exclusions*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

sessionStatMaxCount配置

缺省sessionStatMaxCount是1000個(gè)。你可以按需要進(jìn)行配置,比如:

sessionStatMaxCount1000

sessionStatEnable配置

你可以關(guān)閉session統(tǒng)計(jì)功能,比如:

sessionStatEnablefalse

principalSessionName配置

你可以配置principalSessionName,使得druid能夠知道當(dāng)前的session的用戶是誰(shuí)。比如:

principalSessionNamexxx.user

根據(jù)需要,把其中的xxx.user修改為你user信息保存在session中的sessionName。

注意:如果你session中保存的是非string類型的對(duì)象,需要重載toString方法。

principalCookieName

如果你的user信息保存在cookie中,你可以配置principalCookieName,使得druid知道當(dāng)前的user是誰(shuí)

principalCookieNamexxx.user

根據(jù)需要,把其中的xxx.user修改為你user信息保存在cookie中的cookieName

profileEnable

druid?0.2.7版本開始支持profile,配置profileEnable能夠監(jiān)控單個(gè)url調(diào)用的sql列表。

profileEnabletrue

結(jié)果展示

6.2.Spring關(guān)聯(lián)監(jiān)控配置

Druid提供了Spring和Jdbc的關(guān)聯(lián)監(jiān)控。

配置spring

com.alibaba.druid.support.spring.stat.DruidStatInterceptor是一個(gè)標(biāo)準(zhǔn)的Spring?MethodInterceptor。可以靈活進(jìn)行AOP配置。

Spring?AOP的配置文檔:

按類型攔截配置

druid-stat-interceptor

方法名正則匹配攔截配置

com.mycompany.service.*com.mycompany.dao.*

有些情況下,可能你需要配置proxy-target-class,例如

按照BeanId來(lái)攔截配置

xxx-daoxxx-servicedruid-stat-interceptor

6.Druid防御

Druid提供了WallFilter,它是基于SQL語(yǔ)義分析來(lái)實(shí)現(xiàn)防御SQL注入攻擊的。

這個(gè)文檔提供基于Spring的各種配置方式。

使用缺省配置的WallFilter

...

結(jié)合其他Filter一起使用

WallFilter可以結(jié)合其他Filter一起使用,例如:

...

這樣,攔截檢測(cè)的時(shí)間不在StatFilter統(tǒng)計(jì)的SQL執(zhí)行時(shí)間內(nèi)。

如果希望StatFilter統(tǒng)計(jì)的SQL執(zhí)行時(shí)間內(nèi),則使用如下配置:

...

指定dbType

有時(shí)候,一些應(yīng)用框架做了自己的JDBC?Proxy?Driver,是的DruidDataSource無(wú)法正確識(shí)別數(shù)據(jù)庫(kù)的類型,則需要特別指定,如下:

...

指定配置裝載的目錄

缺省情況下,配置裝載的目錄如下:

數(shù)據(jù)庫(kù)類型

目錄

mysql

META-INF/druid/wall/mysql

oracle

META-INF/druid/wall/oracle

sqlserver

META-INF/druid/wall/sqlserver

postgres

META-INF/druid/wall/postgres

從配置目錄中以下文件中讀取配置:

deny-variant.txtdeny-schema.txtdeny-function.txtdeny-table.txtdeny-object.txt

指定配置裝載的目錄是可以指定,例如:

...

WallConfig詳細(xì)說(shuō)明

本身的配置

配置項(xiàng)

缺省值

dir

按照dbType分別配置:

mysql?:?META-INF/druid/wall/mysql

oracle?:?META-INF/druid/wall/oracle

sqlserver?:?META-INF/druid/wall/sqlserver

攔截配置-語(yǔ)句

配置項(xiàng)

缺省值

描述

selelctAllow

true

是否允許執(zhí)行SELECT語(yǔ)句

selectAllColumnAllow

true

是否允許執(zhí)行SELECT?*?FROM?T這樣的語(yǔ)句。如果設(shè)置為false,不允許執(zhí)行select?*?from?t,但select?*?from?(select?id,?name?from?t)?a。這個(gè)選項(xiàng)是防御程序通過(guò)調(diào)用select?*獲得數(shù)據(jù)表的結(jié)構(gòu)信息。

selectIntoAllow

true

SELECT查詢中是否允許INTO字句

deleteAllow

true

是否允許執(zhí)行DELETE語(yǔ)句

updateAllow

true

是否允許執(zhí)行UPDATE語(yǔ)句

insertAllow

true

是否允許執(zhí)行INSERT語(yǔ)句

replaceAllow

true

是否允許執(zhí)行REPLACE語(yǔ)句

mergeAllow

true

是否允許執(zhí)行MERGE語(yǔ)句,這個(gè)只在Oracle中有用

callAllow

true

是否允許通過(guò)jdbc的call語(yǔ)法調(diào)用存儲(chǔ)過(guò)程

setAllow

true

是否允許使用SET語(yǔ)法

truncateAllow

true

truncate語(yǔ)句是危險(xiǎn),缺省打開,若需要自行關(guān)閉

createTableAllow

true

是否允許創(chuàng)建表

alterTableAllow

true

是否允許執(zhí)行Alter?Table語(yǔ)句

dropTableAllow

true

是否允許修改表

commentAllow

false

是否允許語(yǔ)句中存在注釋,Oracle的用戶不用擔(dān)心,Wall能夠識(shí)別hints和注釋的區(qū)別

noneBaseStatementAllow

false

是否允許非以上基本語(yǔ)句的其他語(yǔ)句,缺省關(guān)閉,通過(guò)這個(gè)選項(xiàng)就能夠屏蔽DDL。

multiStatementAllow

false

是否允許一次執(zhí)行多條語(yǔ)句,缺省關(guān)閉

useAllow

true

是否允許執(zhí)行mysql的use語(yǔ)句,缺省打開

describeAllow

true

是否允許執(zhí)行mysql的describe語(yǔ)句,缺省打開

showAllow

true

是否允許執(zhí)行mysql的show語(yǔ)句,缺省打開

commitAllow

true

是否允許執(zhí)行commit操作

rollbackAllow

true

是否允許執(zhí)行roll?back操作

如果把selectIntoAllow、deleteAllow、updateAllow、insertAllow、mergeAllow都設(shè)置為false,這就是一個(gè)只讀數(shù)據(jù)源了。

攔截配置-永真條件

配置項(xiàng)

缺省值

描述

selectWhereAlwayTrueCheck

true

檢查SELECT語(yǔ)句的WHERE子句是否是一個(gè)永真條件

selectHavingAlwayTrueCheck

true

檢查SELECT語(yǔ)句的HAVING子句是否是一個(gè)永真條件

deleteWhereAlwayTrueCheck

true

檢查DELETE語(yǔ)句的WHERE子句是否是一個(gè)永真條件

deleteWhereNoneCheck

false

檢查DELETE語(yǔ)句是否無(wú)where條件,這是有風(fēng)險(xiǎn)的,但不是SQL注入類型的風(fēng)險(xiǎn)

updateWhereAlayTrueCheck

true

檢查UPDATE語(yǔ)句的WHERE子句是否是一個(gè)永真條件

updateWhereNoneCheck

false

檢查UPDATE語(yǔ)句是否無(wú)where條件,這是有風(fēng)險(xiǎn)的,但不是SQL注入類型的風(fēng)險(xiǎn)

conditionAndAlwayTrueAllow

false

檢查查詢條件(WHERE/HAVING子句)中是否包含AND永真條件

conditionAndAlwayFalseAllow

false

檢查查詢條件(WHERE/HAVING子句)中是否包含AND永假條件

conditionLikeTrueAllow

true

檢查查詢條件(WHERE/HAVING子句)中是否包含LIKE永真條件

其他攔截配置

配置項(xiàng)

缺省值

描述

selectIntoOutfileAllow

false

SELECT?...?INTO?OUTFILE?是否允許,這個(gè)是mysql注入攻擊的常見手段,缺省是禁止的

selectUnionCheck

true

檢測(cè)SELECT?UNION

selectMinusCheck

true

檢測(cè)SELECT?MINUS

selectExceptCheck

true

檢測(cè)SELECT?EXCEPT

selectIntersectCheck

true

檢測(cè)SELECT?INTERSECT

mustParameterized

false

是否必須參數(shù)化,如果為True,則不允許類似WHERE?ID?=?1這種不參數(shù)化的SQL

strictSyntaxCheck

true

是否進(jìn)行嚴(yán)格的語(yǔ)法檢測(cè),Druid?SQL?Parser在某些場(chǎng)景不能覆蓋所有的SQL語(yǔ)法,出現(xiàn)解析SQL出錯(cuò),可以臨時(shí)把這個(gè)選項(xiàng)設(shè)置為false,同時(shí)把SQL反饋給Druid的開發(fā)者。

conditionOpXorAllow

false

查詢條件中是否允許有XOR條件。XOR不常用,很難判斷永真或者永假,缺省不允許。

conditionOpBitwseAllow

true

查詢條件中是否允許有"&"、"~"、"|"、"^"運(yùn)算符。

conditionDoubleConstAllow

false

查詢條件中是否允許連續(xù)兩個(gè)常量運(yùn)算表達(dá)式

minusAllow

true

是否允許SELECT?*?FROM?A?MINUS?SELECT?*?FROM?B這樣的語(yǔ)句

intersectAllow

true

是否允許SELECT?*?FROM?A?INTERSECT?SELECT?*?FROM?B這樣的語(yǔ)句

constArithmeticAllow

true

攔截常量運(yùn)算的條件,比如說(shuō)WHERE?FID?=?3?-?1,其中"3?-?1"是常量運(yùn)算表達(dá)式。

limitZeroAllow

false

是否允許limit?0這樣的語(yǔ)句

禁用對(duì)象檢測(cè)配置

配置項(xiàng)

缺省值

描述

tableCheck

true

檢測(cè)是否使用了禁用的表

schemaCheck

true

檢測(cè)是否使用了禁用的Schema

functionCheck

true

檢測(cè)是否使用了禁用的函數(shù)

objectCheck

true

檢測(cè)是否使用了“禁用對(duì)對(duì)象”

variantCheck

true

檢測(cè)是否使用了“禁用的變量”

readOnlyTables

指定的表只讀,不能夠在SELECT?INTO、DELETE、UPDATE、INSERT、MERGE中作為"被修改表"出現(xiàn)

Jdbc相關(guān)配置

配置項(xiàng)

缺省值

描述

metadataAllow

true

是否允許調(diào)用Connection.getMetadata方法,這個(gè)方法調(diào)用會(huì)暴露數(shù)據(jù)庫(kù)的表信息

wrapAllow

true

是否允許調(diào)用Connection/Statement/ResultSet的isWrapFor和unwrap方法,這兩個(gè)方法調(diào)用,使得有辦法拿到原生驅(qū)動(dòng)的對(duì)象,繞過(guò)WallFilter的檢測(cè)直接執(zhí)行SQL。

WallFiler配置說(shuō)明

配置項(xiàng)

缺省值

描述

logViolation

false

對(duì)被認(rèn)為是攻擊的SQL進(jìn)行LOG.error輸出

throwException

true

對(duì)被認(rèn)為是攻擊的SQL拋出SQLExcepton

config

provider

剛開始引入WallFilter的時(shí)候,把logViolation設(shè)置為true,而throwException設(shè)置為false。就可以觀察是否存在違規(guī)的情況,同時(shí)不影響業(yè)務(wù)運(yùn)行。

7.Druid參考

不同的業(yè)務(wù)場(chǎng)景需求不同,你可以使用我們的參考配置,但建議你仔細(xì)閱讀相關(guān)文檔,了解清楚之后做定制配置。

以下是一個(gè)參考的連接池配置:

通常來(lái)說(shuō),只需要修改initialSize、minIdle、maxActive。

如果用Oracle,則把poolPreparedStatements配置為true,mysql可以配置為false。分庫(kù)分表較多的數(shù)據(jù)庫(kù),建議配置為false。

9.?Druid日志

Druid提供了Log4jFilter、CommonsLogFilter和Slf4jFilter,具體配置看這里:

Druid內(nèi)置提供了三種LogFilter(Log4jFilter、CommonsLogFilter、Slf4jLogFilter),用于輸出JDBC執(zhí)行的日志。這些Filter都是Filter-Chain擴(kuò)展機(jī)制中的Filter,所以配置方式可以參考這里:Filter配置

1.?別名映射

在druid-xxx.jar!/META-INF/druid-filter.properties文件中描述了這三種Filter的別名

druid.filters.log4j=com.alibaba.druid.filter.logging.Log4jFilterdruid.filters.slf4j=com.alibaba.druid.filter.logging.Slf4jLogFilterdruid.filters.commonlogging=com.alibaba.druid.filter.logging.CommonsLogFilterdruid.filters.commonLogging=com.alibaba.druid.filter.logging.CommonsLogFilter

他們的別名分別是log4j、slf4j、commonlogging和commonLogging。其中commonlogging和commonLogging只是大小寫不同。

...?...

2.?loggerName配置

LogFilter都是缺省使用四種不同的Logger執(zhí)行輸出,看實(shí)現(xiàn)代碼:

public?abstract?class?LogFilter?{protected?String??????????dataSourceLoggerName?????????????????=?"druid.sql.DataSource";protected?String??????????connectionLoggerName?????????????????=?"druid.sql.Connection";protected?String??????????statementLoggerName??????????????????=?"druid.sql.Statement";protected?String??????????resultSetLoggerName??????????????????=?"druid.sql.ResultSet";}

你可以根據(jù)你的需要修改,在log4j.properties文件上做配置時(shí),注意配置使用相關(guān)的logger。

3.?配置輸出日志

缺省輸入的日志信息全面,但是內(nèi)容比較多,有時(shí)候我們需要定制化配置日志輸出。

...

參數(shù)

說(shuō)明

dataSourceLogEnabled

所有DataSource相關(guān)的日志

connectionLogEnabled

所有連接相關(guān)的日志

connectionLogErrorEnabled

所有連接上發(fā)生異常的日志

statementLogEnabled

所有Statement相關(guān)的日志

statementLogErrorEnabled

所有Statement發(fā)生異常的日志

resultSetLogEnabled

resultSetLogErrorEnabled

connectionConnectBeforeLogEnabled

connectionConnectAfterLogEnabled

connectionCommitAfterLogEnabled

connectionRollbackAfterLogEnabled

connectionCloseAfterLogEnabled

statementCreateAfterLogEnabled

statementPrepareAfterLogEnabled

statementPrepareCallAfterLogEnabled

statementExecuteAfterLogEnabled

statementExecuteQueryAfterLogEnabled

statementExecuteUpdateAfterLogEnabled

statementExecuteBatchAfterLogEnabled

statementCloseAfterLogEnabled

statementParameterSetLogEnabled

resultSetNextAfterLogEnabled

resultSetOpenAfterLogEnabled

resultSetCloseAfterLogEnabled

4.?log4j.properties配置

如果你使用log4j,可以通過(guò)log4j.properties文件配置日志輸出選項(xiàng),例如:

log4j.logger.druid.sql=warn,stdoutlog4j.logger.druid.sql.DataSource=warn,stdoutlog4j.logger.druid.sql.Connection=warn,stdoutlog4j.logger.druid.sql.Statement=warn,stdoutlog4j.logger.druid.sql.ResultSet=warn,stdout

5.?輸出可執(zhí)行的SQL

Java啟動(dòng)參數(shù)配置方式

-Ddruid.log.stmt.executableSql=true

logFilter參數(shù)直接配置

10.Druid泄露

Druid提供了多種監(jiān)測(cè)連接泄漏的手段

連接泄漏監(jiān)測(cè)

當(dāng)程序存在缺陷時(shí),申請(qǐng)的連接忘記關(guān)閉,這時(shí)候,就存在連接泄漏了。Druid提供了RemoveAbandanded相關(guān)配置,用來(lái)關(guān)閉長(zhǎng)時(shí)間不使用的連接。例如:

配置

...?...???...?...

配置removeAbandoned對(duì)性能會(huì)有一些影響,建議懷疑存在泄漏之后再打開。在上面的配置中,如果連接超過(guò)30分鐘未關(guān)閉,就會(huì)被強(qiáng)行回收,并且日志記錄連接申請(qǐng)時(shí)的調(diào)用堆棧。

內(nèi)置監(jiān)控頁(yè)面查看未關(guān)閉連接堆棧信息

當(dāng)removeAbandoned=true之后,可以在內(nèi)置監(jiān)控界面datasource.html中的查看ActiveConnection?StackTrace屬性的,可以看到未關(guān)閉連接的具體堆棧信息,從而方便查出哪些連接泄漏了。

web應(yīng)用

如果你的應(yīng)用配置了WebStatFilter

在內(nèi)置監(jiān)控頁(yè)面weburi-detail.html中,查看JdbcPoolConnectionOpenCount和JdbcPoolConnectionCloseCount屬性,如果不相等,就是泄漏了。

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的$cfg_dbtype = mysql_Druid连接池二(学习笔记)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。