<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    李順利
    隨筆-50  評(píng)論-170  文章-0  trackbacks-0

    更有效地跟蹤Bug——記錄帶有詳細(xì)參數(shù)值的SQL

    李順利

    目錄

    更有效地跟蹤Bug——記錄帶有詳細(xì)參數(shù)值的SQL. 1

    引子... 2

    log4jdbc. 3

    主頁(yè)... 3

    配置樣例... 3

    效果... 4

    使用評(píng)價(jià)... 5

    jdbcdslog. 6

    主頁(yè)... 6

    配置樣例... 6

    效果... 9

    使用評(píng)價(jià)... 10

    jdbcdslog-exp. 11

    主頁(yè)... 11

    配置樣例... 11

    效果... 11

    新特性和如何使用... 12

    胡言亂語(yǔ)... 14

    總結(jié)或建議... 14

     

    引子

    在實(shí)際開(kāi)發(fā)工作中,可能需要很多調(diào)試的工作,通過(guò)調(diào)試,也許能夠更好地發(fā)現(xiàn)程序的具體問(wèn)題。

    假想下,今天QA同事給你報(bào)了一個(gè)bug,當(dāng)然她們不會(huì)給出具體的原因,而僅僅是給出Bug導(dǎo)致的果,那么你如何fix 這個(gè) bug了,顯然每個(gè)人處理問(wèn)題的方法是不一樣的,但是大致會(huì)這樣: 問(wèn)QA,為什么會(huì)出現(xiàn)這樣的Bug啊、在什么時(shí)間什么地方出現(xiàn)的…? 過(guò)后你可能會(huì)裝作思考狀,良久后說(shuō),這不是我們的問(wèn)題,是部署的問(wèn)題,是DB的問(wèn)題當(dāng)然你還可以聊聊天了(一般來(lái)說(shuō)QA 都是 MM^_^

    當(dāng)然這不是優(yōu)秀且富有激情的程序員干的事情(也許你就是這樣,不過(guò)沒(méi)關(guān)系,也許大家或多或少地時(shí)候都在做同樣的事情),理想的情況是能夠根據(jù)QA MM 的敘述,加上查找有用的日志,能夠重現(xiàn)并解決Bug,如果可以的話,可以和MM聊聊是如何導(dǎo)致這個(gè)Bug的。

        在大部分的環(huán)境下,我們使用的都是很流行的框架,比如說(shuō) Hibernate,在查日志的時(shí)候,當(dāng)然你會(huì)關(guān)心里面SQL的記錄,不過(guò)這些SQL也許并沒(méi)有實(shí)際的價(jià)值,因?yàn)樗鼇G失了很多有用的信息。首先應(yīng)該知道,如果關(guān)心Hibernate 生成的SQL,當(dāng)然需要開(kāi)啟 Show Sql 功能(<property name="showSql" value="true" />),但是你會(huì)發(fā)現(xiàn)你開(kāi)啟后,Log記錄是類似這樣的insert … ?  ?  ?語(yǔ)句,當(dāng)然這還是有些實(shí)用價(jià)值的,不過(guò)這些語(yǔ)句只能算SQL的架子,并不是一個(gè)完整可以運(yùn)行的SQL,而且確實(shí)更多詳細(xì)的數(shù)據(jù),比如這里的“?”是什么。

        假如你關(guān)心SQL 里面的問(wèn)號(hào)(?)到底是什么的話,那么請(qǐng)閱讀下面的內(nèi)容?如果你認(rèn)為這在調(diào)試過(guò)程中并沒(méi)有關(guān)注過(guò),你可以移步尋找你真正感興趣的事情,當(dāng)然還是很歡迎你繼續(xù)閱讀了。

    本文介紹的就是這兩位主角:log4jdbcjdbcdslog。參考官方文檔(官方文檔都很詳細(xì)并全面),你應(yīng)該能夠傻瓜式地配置起這些Tools,這里我就說(shuō)說(shuō)我自己的一些使用建議,并改進(jìn)增強(qiáng)這些工具的功能。

    log4jdbc

    主頁(yè)

    http://code.google.com/p/log4jdbc/

    配置樣例

    mysql.database.driver=net.sf.log4jdbc.DriverSpy

    mysql.database.url= jdbc:log4jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;amp;characterEncoding=utf-8

    (其它log及依賴包的配置請(qǐng)參考官網(wǎng))

    效果

    clip_image002

    使用評(píng)價(jià)

    log4jdbc的優(yōu)點(diǎn)的是配置簡(jiǎn)單,支持全部的主流數(shù)據(jù)庫(kù),而且log中有原生的sql(可以直接運(yùn)行的,這個(gè)想法也是我想改造jdbcdslog的原因,下文介紹),而且整個(gè)project代碼寫(xiě)的很優(yōu)美,不過(guò)遺憾的是,目前還不支持 DataSource(XA,Pooling),就因?yàn)檫@點(diǎn)我舍棄了它,現(xiàn)在的項(xiàng)目是Data Source + XA ,真的感覺(jué)有點(diǎn)遺憾。不過(guò)下載源碼你會(huì)知道,有份TODO,作者會(huì)在下個(gè)版本進(jìn)行實(shí)現(xiàn),希望log4jdbc擴(kuò)展得越來(lái)越實(shí)用。官網(wǎng)wiki里有篇文章http://code.google.com/p/log4jdbc/wiki/DataSourceExampleForWebSphere,也是介紹如何能夠使用DataSource ,我沒(méi)有深入研究了,如果有興趣的同學(xué),可以研究下,再開(kāi)源出來(lái),相應(yīng)大家會(huì)感謝您的辛苦。

    Google code 上面確實(shí)有Javaer實(shí)現(xiàn)了(google code projcect  url: log4jdbc-remix),我拿來(lái)用了一下,發(fā)現(xiàn)在不改變?cè)渲?span lang="EN-US">(log4jdbc)的基礎(chǔ)上,是有問(wèn)題的, 錯(cuò)誤的具體issues請(qǐng)見(jiàn)http://code.google.com/p/log4jdbc-remix/issues/detail?id=3,后來(lái)也就沒(méi)有使用了(不過(guò)我相信作者肯定是成功改造后才共享出來(lái),可能是一些環(huán)境問(wèn)題導(dǎo)致的這個(gè)小小問(wèn)題)。

    (相關(guān)的配置相信你完全可以通過(guò)官網(wǎng)介紹成功地配置好,如果有少少問(wèn)題的話,可以參考我使用log4jdbc的一個(gè)小Demo,請(qǐng)使用 svn check http://usc.googlecode.com/svn/SSHWithAnnotationDemoUselog4jdbc/ )。

    jdbcdslog

    主頁(yè)

    http://code.google.com/p/jdbcdslog/

    配置樣例

    MySql

    mysql.database.driver=org.jdbcdslog.DriverLoggingProxy

    mysql.database.url=jdbc\:jdbcdslog\:mysql\://127.0.0.1\:3306/test?useUnicode\=true&amp;amp;characterEncoding\=utf-8;targetDriver\=com.mysql.jdbc.Driver

    mysql.database.user=root

    mysql.database.password=lishunli

    mysql.database.maxActive=100

    mysql.database.maxIdle=30

    mysql.database.maxWait=500

     

    Spring DI

        <jee:jndi-lookup id="mssDataSourceActual" jndi-name="${mss.dataSource.main.jndiName}"/>

        <bean id="mssDataSource" class="org.jdbcdslog.ConnectionPoolXADataSourceProxy">

            <property name="targetDSDirect" ref="mssDataSourceActual" />

        </bean>

    jndi的使用,請(qǐng)google

    Weblogic + Oracle

      <jdbc-driver-params>

        <url>jdbc:oracle:thin:@10.100.53.85:1521:cmn?targetDS=oracle.jdbc.xa.client.OracleXADataSource</url>

        <driver-name>org.jdbcdslog.ConnectionPoolXADataSourceProxy</driver-name>

        <properties>

          <property>

            <name>user</name>

            <value>mssapp</value>

          </property>

          <property>

            <name>serverName</name>

            <value>10.100.53.85</value>

          </property>

          <property>

            <name>portNumber</name>

            <value>1521</value>

          </property>

          <property>

            <name>SID</name>

            <value>cmn</value>

          </property>

        </properties>

        <password-encrypted>{3DES}ThgsfHr3yB1bfpnD4u/t3A==</password-encrypted>

      </jdbc-driver-params>

     

    JBoss + Oracle

      <xa-datasource>

        <jndi-name>jdbc/coreDataSource</jndi-name>

        <debug>true</debug>

        <track-connection-by-tx>true</track-connection-by-tx>

        <track-statements>true</track-statements>

        <isSameRM-override-value>false</isSameRM-override-value>   

        <xa-datasource-class>org.jdbcdslog.ConnectionPoolXADataSourceProxy</xa-datasource-class>

        <xa-datasource-property name="URL">jdbc:oracle:thin:@10.100.53.85:1521:cmn?targetDS=oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-property>

        <xa-datasource-property name="User">report</xa-datasource-property>

        <xa-datasource-property name="Password">report</xa-datasource-property>

        <min-pool-size>10</min-pool-size>

        <max-pool-size>200</max-pool-size>

        <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>

        <no-tx-separate-pools/>

      </xa-datasource>

     

    效果

    clip_image004

    使用評(píng)價(jià)

    支持DataSource(XA,Pooling)jdbcdslog最大的亮點(diǎn),還有一個(gè)就是作者真的很用心,wiki(文檔)寫(xiě)的太詳細(xì)了,以至于只要看到這份wiki,就完全能夠使用jdbcdslog;而log記錄的sql的不友好則是它最大的缺憾(我個(gè)人是這樣認(rèn)為的,也行你覺(jué)得非常完美),如果能像log4jdbc那樣顯示完整的SQL,那么 jdbcdslog 就很優(yōu)秀了。

    為了向著我自己完美的目標(biāo)前進(jìn),我自己增強(qiáng)了jdbcdslog,使其滿足我(也許還有其他人)的需要。

    :個(gè)人覺(jué)得不友好的地方是:雖然參數(shù)都已經(jīng)寫(xiě)的很清晰了,但是這個(gè)語(yǔ)句并不能地直接使用(拿這個(gè)sql在控制臺(tái)上面直接運(yùn)行),如果需要的話,可能還需要我們一個(gè)一個(gè)參數(shù)進(jìn)行替換后才可以使用。

    (相關(guān)的配置可以參考我使用jdbcdslog的一個(gè)小Demo,請(qǐng)使用 svn check http://usc.googlecode.com/svn/SSHWithAnnotationDemo/ )。


    jdbcdslog-exp

    主頁(yè)

    當(dāng)然,這個(gè)就是我fork的,主頁(yè)在 http://code.google.com/p/jdbcdslog-exp/,具體的增強(qiáng)功能和如何使用,可以在這里找到。

    配置樣例

    這個(gè)就不貼了,因?yàn)?span lang="EN-US">jdbcdslog-exp 并沒(méi)有修改jdbcdslog的配置,使用它的配置就可以了。不過(guò)增強(qiáng)功能的會(huì)需要少少配置,下面再說(shuō)。

    效果

    增強(qiáng)的效果如下:

    和上面的效果進(jìn)行對(duì)照,你會(huì)發(fā)現(xiàn)我修改了什么(注意紅色下劃線部分)

    clip_image006

     

    有沒(méi)有發(fā)現(xiàn)這個(gè)sql是可以直接運(yùn)行的,而且也去掉了執(zhí)行時(shí)間的日志(復(fù)制更加簡(jiǎn)單,Sql一般很長(zhǎng)了,從 “select”再 shift+end 就可以選擇一行了),是不是很方便。

    新特性和如何使用

    1) 可以直接填充SQL語(yǔ)句的參數(shù),當(dāng)然生成的日志語(yǔ)句是可以直接復(fù)制出來(lái)使用的,這個(gè)在上面的效果圖中已經(jīng)體現(xiàn);

    數(shù)據(jù)庫(kù)的不同,生成的SQL會(huì)有些不同,比如關(guān)鍵詞(特殊字符),在Oracle中有' and & and \r, \n,\tSQL Server中有' Mysql中有' and " and \ and \r,\n,\t注:考慮過(guò)like語(yǔ)句中的特殊字符,不過(guò)jdbcdslog-exp并沒(méi)有實(shí)現(xiàn),這部分,一則我覺(jué)得使用率比較少,一則如果真的有的話,注意下應(yīng)該也不是那么困難。,再比如日期格式。那么如何更改數(shù)據(jù)庫(kù)類型來(lái)選擇合適的生成語(yǔ)句,請(qǐng)看:

    jdbcdslog.properties文件(這個(gè)可以參考原始的文檔,或者直接新建 jdbcdslog.properties 配置文件放在 class path 路徑下就可以了)中配置

    #jdbcdslog driver name.if empty,is oracle(default db)

    #you may choose "oracle","mysql" ,"sqlserver" or empty (Case-insensitive and does not need the double quotes)

    jdbcdslog.driverName=oracle

    2) 可以配置是否顯示SQL執(zhí)行的時(shí)間,默認(rèn)不顯示,這個(gè)默認(rèn)選擇,也在上面效果圖中體現(xiàn)了,當(dāng)然你可以通過(guò)下面的配置顯示出來(lái)。

    同樣在jdbcdslog.properties文件中配置

    #jdbcdslog will show elapsed time

    jdbcdslog.showTime=true

    3) Maven的支持

    Maven的天下已經(jīng)或者快要來(lái)的,當(dāng)然要支持了,你可以這樣依賴:

    <dependency>
       
    <groupId>com.googlecode.usc</groupId>
       
    <artifactId>jdbcdslog</artifactId>
       
    <version>1.0.6.2</version>
    </dependency>

    jdbcdslog-exp 已經(jīng)放到Maven中央倉(cāng)庫(kù)里了(如何deploy maven central repo?請(qǐng)閱讀我上篇文章:Maven Artifacts如何部署到倉(cāng)庫(kù)),為了名稱的一致性,選用了jdbcdslog 作為構(gòu)建名,而不是jdbcdslog-exp

    或者http://jdbcdslog-exp.googlecode.com/files/jdbcdslog-1.0.6.2.jar通過(guò)下載并放到class patch里面即可,更多下載請(qǐng)見(jiàn)http://code.google.com/p/jdbcdslog-exp/downloads/list,包括源代碼和Javadoc,當(dāng)然你可以通過(guò)svn checkout下來(lái),自己在繼續(xù)改進(jìn), svn url http://jdbcdslog-exp.googlecode.com/svn/trunk/

    胡言亂語(yǔ)

    實(shí)際上,這篇博文早就寫(xiě)了個(gè)大概,但是被下面的問(wèn)題一直耽誤著:

    我使用的是Weblogic + Oracle(安裝在本地其他的機(jī)器),使用的是org.jdbcdslog.ConnectionPoolXADataSourceProxy,但是不知為什么,在某些情況下,就會(huì)出現(xiàn)weblogic卡著,執(zhí)行不下去,一段時(shí)間后,就會(huì)出現(xiàn)超時(shí)(Time Out)異常,經(jīng)過(guò)很長(zhǎng)時(shí)間的調(diào)試和查看,可能有兩個(gè)原因造成的:

    1)  jdbcdslog(jdbcdslog-exp) 本身的Bug,對(duì)處理 datasource 類型沒(méi)有相應(yīng)的關(guān)閉鏈接(我猜測(cè));

    2)  本地Oracle DB安裝有問(wèn)題,因?yàn)槲业耐乱舶l(fā)生過(guò)這樣的情況,不過(guò)比我少多了。

    不過(guò)你不用擔(dān)心,這種情況還是比較少出現(xiàn)的,還不影響正常的使用(開(kāi)發(fā)階段)的。如果您知道為什么會(huì)出現(xiàn)這種情況或者有類似的問(wèn)題出現(xiàn),歡迎討論。謝謝。

    總結(jié)或建議

    1.  如果要使用jdbcdslog 或者 jdbcdslog-exp,請(qǐng)先閱讀jdbcdslog’s UserGuide http://code.google.com/p/jdbcdslog/wiki/UserGuide

    2.  jdbcdslog 只是一個(gè)獨(dú)立包,需要 slf4j-api slf4j-log4j12 的支持。

    3.  Log中只需要開(kāi) statement info,其它的都不需要,如果考慮性能測(cè)試的時(shí)候,就另當(dāng)別論了。像這樣(log4j.xml):

      <!-- logger: jdbcdslog -->

      <logger name="org.jdbcdslog.StatementLogger">

        <level value="INFO"/>

      </logger>

     

      <logger name="org.jdbcdslog.ResultSetLogger">

        <level value="OFF"/>

      </logger>

     

       <logger name="org.jdbcdslog.SlowQueryLogger">

        <level value="OFF"/>

      </logger> 

     

      <logger name="org.jdbcdslog.ConnectionLogger">

        <level value="OFF"/>

      </logger>

    4.  上面關(guān)于JDBC工具的實(shí)現(xiàn)使用的是代理,類似AOP思想,都是通過(guò)監(jiān)聽(tīng)(可能說(shuō)Spy更好一點(diǎn))數(shù)據(jù)層, 獲取JDBC所帶來(lái)的數(shù)據(jù)信息。當(dāng)然還有很多優(yōu)秀的工具包能夠?qū)崿F(xiàn)這樣的功能,比如 spy6

    5.  當(dāng)然你如果對(duì)Git感興趣的話,你可以clone 或者 fork  git://github.com/usc/jdbcdslog.git (from https://github.com/usc/jdbcdslog)

    6.  如果你有什么問(wèn)題,非常歡迎通過(guò)Email(lishunli.me@gmail.com) 聯(lián)系我,或者QQ:506817493, 或者微博@李順利Me(http://weibo.com/lishunli)

    亦或者請(qǐng)幫忙在http://code.google.com/p/jdbcdslog-exp/issues/list 里面創(chuàng)建Issues,我會(huì)及時(shí)處理的,謝謝。

     

    順利更新于2011125



    博客中的一些下載已經(jīng)放到了百度云了,請(qǐng)根據(jù)需要下載。【點(diǎn)我去百度云下載】

    最后弱弱地說(shuō)一下,如果可以的話,轉(zhuǎn)載請(qǐng)?zhí)峁┏鎏? ),謝謝。
    posted on 2011-12-05 01:04 李順利 閱讀(4671) 評(píng)論(6)  編輯  收藏

    評(píng)論:
    # re: 更有效地跟蹤Bug&mdash;&mdash;記錄帶有詳細(xì)參數(shù)值的SQL[未登錄](méi) 2011-12-07 17:10 | tbw
    編輯這么好的文章,還真花時(shí)間。。支持  回復(fù)  更多評(píng)論
      
    # re: 更有效地跟蹤Bug&mdash;&mdash;記錄帶有詳細(xì)參數(shù)值的SQL 2012-04-10 15:29 | 賈曉峰
    很不錯(cuò)啊。我還準(zhǔn)備在自己項(xiàng)目中重新寫(xiě)下1.0.5的版本呢。用你fork的正好滿足了我的需求。可能中國(guó)人的想法就是不一樣。哈哈  回復(fù)  更多評(píng)論
      
    # re: 更有效地跟蹤Bug&mdash;&mdash;記錄帶有詳細(xì)參數(shù)值的SQL 2012-04-10 18:12 | 李順利
    @賈曉峰
    一切為了方便自己  回復(fù)  更多評(píng)論
      
    # re: 更有效地跟蹤Bug&mdash;&mdash;記錄帶有詳細(xì)參數(shù)值的SQL 2013-12-21 11:10 | 最代碼
    db層就有完整的sql輸出解決方案,在業(yè)務(wù)層做這個(gè)處理是否復(fù)雜了?  回復(fù)  更多評(píng)論
      
    # re: 更有效地跟蹤Bug&mdash;&mdash;記錄帶有詳細(xì)參數(shù)值的SQL 2013-12-21 13:05 | 李順利
    @最代碼
    1. 請(qǐng)問(wèn)db層完整的sql輸出解決方案是如何完成的,我學(xué)習(xí)下
    2. 這個(gè)是業(yè)務(wù)層處理的嗎?  回復(fù)  更多評(píng)論
      
    # re: 更有效地跟蹤Bug&mdash;&mdash;記錄帶有詳細(xì)參數(shù)值的SQL 2013-12-23 16:26 | 最代碼
    @李順利
    我總結(jié)分享了一份代碼,你參考下:http://www.zuidaima.com/share/1618579475975168.htm  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费国产成人高清视频网站| 亚洲欧洲AV无码专区| 中文字幕久无码免费久久| 日日操夜夜操免费视频| 亚洲va在线va天堂成人| 91精品免费高清在线| 亚洲国产精品成人久久| 国产精品九九久久免费视频| 又粗又大又猛又爽免费视频| 亚洲精品理论电影在线观看| 欧美男同gv免费网站观看 | 亚洲av无码一区二区三区乱子伦| 四虎影视久久久免费| 国产乱子伦精品免费女| 亚洲国产精品嫩草影院| 四虎成人免费大片在线| 亚洲欧美日韩综合久久久| 野花高清在线电影观看免费视频 | 亚洲福利视频导航| 国产成人精品无码免费看| 亚洲国产精品无码中文字| 久久美女网站免费| 亚洲国产人成网站在线电影动漫 | 免费看美女让人桶尿口| 国产成人亚洲综合一区| 免费a级毛片无码a∨蜜芽试看| 亚洲视频一区二区三区四区| 日韩免费精品视频| 亚洲人成毛片线播放| 成人片黄网站A毛片免费| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲AV无码专区在线厂| 在线看片无码永久免费aⅴ| 亚洲变态另类一区二区三区| 欧洲美熟女乱又伦免费视频| 亚洲AV永久无码精品放毛片| 国产精品麻豆免费版| 羞羞视频免费网站日本| 中文字幕亚洲综合久久菠萝蜜 | 亚洲人成色77777在线观看大| 一级毛片免费播放试看60分钟|