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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

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

6.Druid關聯(lián)

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

WebStatFilter用于采集web-jdbc關聯(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個。你可以按需要進行配置,比如:

sessionStatMaxCount1000

sessionStatEnable配置

你可以關閉session統(tǒng)計功能,比如:

sessionStatEnablefalse

principalSessionName配置

你可以配置principalSessionName,使得druid能夠知道當前的session的用戶是誰。比如:

principalSessionNamexxx.user

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

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

principalCookieName

如果你的user信息保存在cookie中,你可以配置principalCookieName,使得druid知道當前的user是誰

principalCookieNamexxx.user

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

profileEnable

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

profileEnabletrue

結果展示

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

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

配置spring

com.alibaba.druid.support.spring.stat.DruidStatInterceptor是一個標準的Spring?MethodInterceptor??梢造`活進行AOP配置。

Spring?AOP的配置文檔:

按類型攔截配置

druid-stat-interceptor

方法名正則匹配攔截配置

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

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

按照BeanId來攔截配置

xxx-daoxxx-servicedruid-stat-interceptor

6.Druid防御

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

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

使用缺省配置的WallFilter

...

結合其他Filter一起使用

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

...

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

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

...

指定dbType

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

...

指定配置裝載的目錄

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

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

目錄

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詳細說明

本身的配置

配置項

缺省值

dir

按照dbType分別配置:

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

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

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

攔截配置-語句

配置項

缺省值

描述

selelctAllow

true

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

selectAllColumnAllow

true

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

selectIntoAllow

true

SELECT查詢中是否允許INTO字句

deleteAllow

true

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

updateAllow

true

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

insertAllow

true

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

replaceAllow

true

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

mergeAllow

true

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

callAllow

true

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

setAllow

true

是否允許使用SET語法

truncateAllow

true

truncate語句是危險,缺省打開,若需要自行關閉

createTableAllow

true

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

alterTableAllow

true

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

dropTableAllow

true

是否允許修改表

commentAllow

false

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

noneBaseStatementAllow

false

是否允許非以上基本語句的其他語句,缺省關閉,通過這個選項就能夠屏蔽DDL。

multiStatementAllow

false

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

useAllow

true

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

describeAllow

true

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

showAllow

true

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

commitAllow

true

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

rollbackAllow

true

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

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

攔截配置-永真條件

配置項

缺省值

描述

selectWhereAlwayTrueCheck

true

檢查SELECT語句的WHERE子句是否是一個永真條件

selectHavingAlwayTrueCheck

true

檢查SELECT語句的HAVING子句是否是一個永真條件

deleteWhereAlwayTrueCheck

true

檢查DELETE語句的WHERE子句是否是一個永真條件

deleteWhereNoneCheck

false

檢查DELETE語句是否無where條件,這是有風險的,但不是SQL注入類型的風險

updateWhereAlayTrueCheck

true

檢查UPDATE語句的WHERE子句是否是一個永真條件

updateWhereNoneCheck

false

檢查UPDATE語句是否無where條件,這是有風險的,但不是SQL注入類型的風險

conditionAndAlwayTrueAllow

false

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

conditionAndAlwayFalseAllow

false

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

conditionLikeTrueAllow

true

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

其他攔截配置

配置項

缺省值

描述

selectIntoOutfileAllow

false

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

selectUnionCheck

true

檢測SELECT?UNION

selectMinusCheck

true

檢測SELECT?MINUS

selectExceptCheck

true

檢測SELECT?EXCEPT

selectIntersectCheck

true

檢測SELECT?INTERSECT

mustParameterized

false

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

strictSyntaxCheck

true

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

conditionOpXorAllow

false

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

conditionOpBitwseAllow

true

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

conditionDoubleConstAllow

false

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

minusAllow

true

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

intersectAllow

true

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

constArithmeticAllow

true

攔截常量運算的條件,比如說WHERE?FID?=?3?-?1,其中"3?-?1"是常量運算表達式。

limitZeroAllow

false

是否允許limit?0這樣的語句

禁用對象檢測配置

配置項

缺省值

描述

tableCheck

true

檢測是否使用了禁用的表

schemaCheck

true

檢測是否使用了禁用的Schema

functionCheck

true

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

objectCheck

true

檢測是否使用了“禁用對對象”

variantCheck

true

檢測是否使用了“禁用的變量”

readOnlyTables

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

Jdbc相關配置

配置項

缺省值

描述

metadataAllow

true

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

wrapAllow

true

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

WallFiler配置說明

配置項

缺省值

描述

logViolation

false

對被認為是攻擊的SQL進行LOG.error輸出

throwException

true

對被認為是攻擊的SQL拋出SQLExcepton

config

provider

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

7.Druid參考

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

以下是一個參考的連接池配置:

通常來說,只需要修改initialSize、minIdle、maxActive。

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

9.?Druid日志

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

Druid內(nèi)置提供了三種LogFilter(Log4jFilter、CommonsLogFilter、Slf4jLogFilter),用于輸出JDBC執(zhí)行的日志。這些Filter都是Filter-Chain擴展機制中的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í)行輸出,看實現(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文件上做配置時,注意配置使用相關的logger。

3.?配置輸出日志

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

...

參數(shù)

說明

dataSourceLogEnabled

所有DataSource相關的日志

connectionLogEnabled

所有連接相關的日志

connectionLogErrorEnabled

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

statementLogEnabled

所有Statement相關的日志

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,可以通過log4j.properties文件配置日志輸出選項,例如:

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啟動參數(shù)配置方式

-Ddruid.log.stmt.executableSql=true

logFilter參數(shù)直接配置

10.Druid泄露

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

連接泄漏監(jiān)測

當程序存在缺陷時,申請的連接忘記關閉,這時候,就存在連接泄漏了。Druid提供了RemoveAbandanded相關配置,用來關閉長時間不使用的連接。例如:

配置

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

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

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

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

web應用

如果你的應用配置了WebStatFilter

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

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

總結

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

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