Spring+SpringMVC+MyBatis+easyUI整合優(yōu)化篇(十一)數(shù)據(jù)層優(yōu)化-druid監(jiān)控及慢sql記錄

本文提要

前文也提到過(guò)druid不僅僅是一個(gè)連接池技術(shù),因此在將整合druid到項(xiàng)目中后,這一篇文章將去介紹druid的其他特性和功能早抠,作為一個(gè)輔助工具幫助提升項(xiàng)目的性能吻贿,本文的重點(diǎn)就是兩個(gè)字:監(jiān)控。
我的github地址點(diǎn)這里

druid監(jiān)控

因?yàn)橐呀?jīng)做了整合,所以這一步較為簡(jiǎn)單,只需要在web.xml中做一下簡(jiǎn)單的Servlet配置即可。

<!--druid監(jiān)控頁(yè)面 -->
    <servlet>
        <servlet-name>DruidStatView</servlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
        <init-param>
            <!-- 不允許清空統(tǒng)計(jì)數(shù)據(jù) -->
            <param-name>resetEnable</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <!-- 用戶(hù)名 -->
            <param-name>loginUsername</param-name>
            <param-value>yourname</param-value>
        </init-param>
        <init-param>
            <!-- 密碼 -->
            <param-name>loginPassword</param-name>
            <param-value>yourpassword</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>
    <!--druid監(jiān)控頁(yè)面 -->

重新構(gòu)建工程并啟動(dòng)tomcat咸产,在瀏覽器中輸入druid即可進(jìn)入到druid監(jiān)控面板的登錄頁(yè)面。


登錄頁(yè)面

輸入在web.xml中配置的賬號(hào)和密碼即可進(jìn)入監(jiān)控后臺(tái)仲闽,注意脑溢,配置的賬號(hào)和密碼是明文,你在這里配置什么就是什么赖欣,并沒(méi)有經(jīng)過(guò)加密屑彻。


druid簡(jiǎn)述信息

OK,我們看到系統(tǒng)的一些簡(jiǎn)述信息畏鼓,當(dāng)然酱酬,你也應(yīng)該看到啟動(dòng)時(shí)間了,沒(méi)錯(cuò)云矫,我就是在下班后9點(diǎn)多才開(kāi)始寫(xiě)這篇博客的膳沽。

接下來(lái)是比較重要的一個(gè)頁(yè)面,SQL監(jiān)控


SQL監(jiān)控

從這個(gè)頁(yè)面里我們能看到網(wǎng)站從啟動(dòng)開(kāi)始執(zhí)行的sql語(yǔ)句統(tǒng)計(jì),每一條語(yǔ)句的執(zhí)行次數(shù)挑社、執(zhí)行時(shí)間之和陨界、最慢執(zhí)行時(shí)間、執(zhí)行錯(cuò)誤數(shù)等等多個(gè)統(tǒng)計(jì)指標(biāo)痛阻,通過(guò)這個(gè)統(tǒng)計(jì)數(shù)據(jù)我們可以找出sql語(yǔ)句的執(zhí)行規(guī)律及sql語(yǔ)句的不足之處菌瘪,也可以通過(guò)錯(cuò)誤數(shù)來(lái)定位程序的不足并及時(shí)修改。

在配置druid數(shù)據(jù)源時(shí)阱当,做了如下配置俏扩,開(kāi)啟了druid防火墻。

 <property name="filters" value="wall,stat"/>

因此在控制后臺(tái)也能見(jiàn)到SQL防火墻面板弊添,如下圖所示:


SQL防火墻

面板里是防御統(tǒng)計(jì)及sql的統(tǒng)計(jì)信息录淡,這里用的是druid默認(rèn)的一些過(guò)濾規(guī)則,并沒(méi)有自定義復(fù)雜的防火墻規(guī)則油坝,因此也不細(xì)說(shuō)了嫉戚。

但是再去點(diǎn)擊其他幾個(gè)頁(yè)面的時(shí)候,發(fā)現(xiàn)頁(yè)面中都是空數(shù)據(jù)澈圈,因?yàn)椴](méi)有開(kāi)啟druid相關(guān)的功能彬檀。這是比較粗糙些的做法,不用做其他配置瞬女,就是默認(rèn)的filters配置加上Servlet配置窍帝,雖然也有監(jiān)控和統(tǒng)計(jì),但是并不是特別滿(mǎn)足需求拆魏。

開(kāi)啟慢sql監(jiān)控

在SQL監(jiān)控中盯桦,有一項(xiàng)關(guān)于sql執(zhí)行最慢執(zhí)行時(shí)間的統(tǒng)計(jì),但是只有一個(gè)值渤刃,就是一條sql語(yǔ)句最慢的執(zhí)行時(shí)間記錄,其他執(zhí)行時(shí)間是看不到的贴膘,只能通過(guò)總時(shí)間來(lái)進(jìn)行粗略的估計(jì)卖子,還有一個(gè)問(wèn)題就是,一旦項(xiàng)目重啟刑峡,這些記錄就全都沒(méi)了洋闽,因此制定對(duì)應(yīng)的日志輸出策略是極其必要的。
大致想法就是通過(guò)druid獲取所有項(xiàng)目運(yùn)行中的慢sql執(zhí)行記錄突梦,并將這些數(shù)據(jù)輸出到日志文件中诫舅,查了一下druid的資料,調(diào)試了一段時(shí)間宫患,最終成功實(shí)現(xiàn)刊懈。

1、修改數(shù)據(jù)源配置,增加攔截器:

 <property name="proxyFilters">
            <list>
                <ref bean="stat-filter"/>
                <ref bean="log-filter"/>
            </list>
        </property>

2虚汛、配置慢sql及日志攔截器:

    <!-- 慢SQL記錄 -->
    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
        <!-- 慢sql時(shí)間設(shè)置,即執(zhí)行時(shí)間大于200毫秒的都是慢sql -->
        <property name="slowSqlMillis" value="200"/>
        <property name="logSlowSql" value="true"/>
    </bean>

    <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
        <property name="dataSourceLogEnabled" value="true" />
        <property name="statementExecutableSqlLogEnable" value="true" />
    </bean>

3匾浪、修改log4j配置文件,增加慢sql日志的輸出策略:

log4j.rootLogger=DEBUG,debug,druid
# Druid
log4j.logger.druid.sql=WARN,druid
log4j.logger.druid.sql.DataSource=WARN,druid
log4j.logger.druid.sql.Connection=WARN,druid
log4j.logger.druid.sql.Statement=WARN,druid

log4j.appender.druid=org.apache.log4j.DailyRollingFileAppender
log4j.appender.druid.layout=org.apache.log4j.PatternLayout
log4j.appender.druid.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%n
log4j.appender.druid.datePattern='.'yyyy-MM-dd
log4j.appender.druid.Threshold = WARN
log4j.appender.druid.append=true
log4j.appender.druid.File=${catalina.home}/logs/ssm-maven/druid-slow-sql.log

重啟再去查看druid監(jiān)控后臺(tái)卷哩,可以看到跟原來(lái)有了一些差別蛋辈,由于設(shè)置了慢sql的時(shí)間為大于200毫秒,所以執(zhí)行時(shí)間大于200毫秒的都會(huì)被紅色標(biāo)注将谊。


慢sql標(biāo)紅

再去tomcat日志文件夾中查看日志文件冷溶,可以看到日志文件中已經(jīng)存在配置的慢sql日志文件了,點(diǎn)擊查看其中也已經(jīng)有了慢sql記錄的數(shù)據(jù)尊浓,慢sql以及這條sql語(yǔ)句執(zhí)行的時(shí)間都有記錄逞频。


慢sql日志

開(kāi)啟spring監(jiān)控

在監(jiān)控面板中看到有spring監(jiān)控這個(gè)功能,但是由于沒(méi)有進(jìn)行配置眠砾,所以功能不能用虏劲,查了一下druid的文檔,最終開(kāi)啟了spring監(jiān)控功能褒颈。

配置如下:

    <bean id="druid-stat-interceptor"
          class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
    </bean>

    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
          scope="prototype">
        <property name="patterns">
            <list>
                <value>com.ssm.maven.core.service.*</value>
                <value>com.ssm.maven.core.dao.*</value>
            </list>
        </property>
    </bean>

    <aop:config>
        <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/>
    </aop:config>

再次查看spring監(jiān)控頁(yè)面柒巫,已經(jīng)有了數(shù)據(jù):


spring監(jiān)控

原先的做法只能對(duì)sql語(yǔ)句及jdbc相關(guān)操作進(jìn)行監(jiān)控,無(wú)法監(jiān)控到代碼級(jí)別的運(yùn)行谷丸,因此進(jìn)一步設(shè)置堡掏,結(jié)合spring的AOP特性對(duì)代碼的運(yùn)行效果進(jìn)行監(jiān)控,druid可以做到方法級(jí)別的監(jiān)控刨疼,這個(gè)功能可以讓你發(fā)現(xiàn)方法的調(diào)用頻率及方法的運(yùn)行時(shí)間泉唁,及時(shí)做出調(diào)整和修正使得項(xiàng)目更健壯。

結(jié)語(yǔ)

因?yàn)槲蚁雽?duì)網(wǎng)站的一些信息和運(yùn)行情況進(jìn)行監(jiān)控揩慕,因此在代碼中集成了druid的相關(guān)功能亭畜,也上傳到了github倉(cāng)庫(kù),如果你不需要的話迎卤,可以根據(jù)我在代碼里寫(xiě)的注釋刪除相關(guān)配置文件即可拴鸵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜗搔,隨后出現(xiàn)的幾起案子劲藐,更是在濱河造成了極大的恐慌,老刑警劉巖樟凄,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聘芜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缝龄,警方通過(guò)查閱死者的電腦和手機(jī)汰现,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)挂谍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人服鹅,你說(shuō)我怎么就攤上這事凳兵。” “怎么了企软?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵庐扫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我仗哨,道長(zhǎng)形庭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任厌漂,我火速辦了婚禮萨醒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苇倡。我一直安慰自己富纸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布旨椒。 她就那樣靜靜地躺著晓褪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪综慎。 梳的紋絲不亂的頭發(fā)上涣仿,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音示惊,去河邊找鬼好港。 笑死,一個(gè)胖子當(dāng)著我的面吹牛米罚,可吹牛的內(nèi)容都是我干的钧汹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼录择,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼崭孤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起糊肠,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遗锣,沒(méi)想到半個(gè)月后货裹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡精偿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年弧圆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赋兵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搔预,死狀恐怖霹期,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拯田,我是刑警寧澤历造,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站船庇,受9級(jí)特大地震影響吭产,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸭轮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一臣淤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窃爷,春花似錦邑蒋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刻剥,卻和暖如春遮咖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背造虏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工御吞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漓藕。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓陶珠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親享钞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揍诽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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