xylz,imxylz

          關(guān)注后端架構(gòu)、中間件、分布式和并發(fā)編程

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

          最近的項目使用的是舊的ibatis2.x版本,有時候為了方便調(diào)試,想輸出SQL執(zhí)行的語句和參數(shù)。我記得應(yīng)該有某些logger的日志級別修改為DEBUG就可以看到。當(dāng)然為了方便可以直接在log4j(如果使用log4j的話)的root日志級別修改為DEBUG,并且輸出appender的接受級別修改為DEBUG就可以了。這樣是可以看到日志信息(SQL/參數(shù))等,但是同時也輸出了過多的其它logger信息,顯然在一個稍微大一點的系統(tǒng)里面debug的信息應(yīng)該都是非常多的,不說別的,光是spring的日志就夠好多頁了。

          為了解決過多的日志,翻出ibatis源碼,看了下。ibatis的執(zhí)行流程大致是這樣的。

          ibatis-log

          執(zhí)行步驟如下:

          1. 通過SqlMapClient執(zhí)行query/execute操作;
          2. 打開一個SqlMapSession會話(openSession());
          3. 設(shè)置數(shù)據(jù)源(DataSource)或者外部給的java.sql.Connection;
          4. 通過java.sql.Connection和外部給的Transaction(如果有的話)構(gòu)造事務(wù);
          5. 如果java.sql.Connection的日志級別為DEBUG,構(gòu)造一個帶日志記錄的ConnectionLogProxy(是java.sql.Connection的一個Proxy);
          6. 在ConnectionLogProxy中構(gòu)造一個帶日志記錄的PreparedStatementLogProxy(是java.sql.PreparedStatement的一個Proxy);
          7. 執(zhí)行java.sql.Connection中的操作(如果是ConnectionLogProxy就記錄連接日志);
          8. 執(zhí)行java.sql.PreparedStatement操作(如果是PreparedStatementLogProxy就記錄操作記錄,包括SQL信息)。

          我們看三段代碼:

           

           

           

          第一段代碼可以看到,要想記錄日志的前提是java.sql.Connection的logger的級別是DEBUG或者更低。

          第二段代碼可以看到,要想記錄PreparedStatement的日志,那么比如滿足上述第一段代碼的條件。這里會記錄連接Connection打開的相關(guān)信息,比如是否是新開的Connection,這可以從id中分析出。ConnectionLogProxy是java.sql.Connection的一個Proxy實現(xiàn)。

          第三段代碼可以看到,記錄PreparedStatement的日志(SQL/參數(shù))需要java.sql.PreparedStatement的logger的級別是DEBUG或者更低。這里會記錄執(zhí)行的SQL、參數(shù)、參數(shù)類型等。PreparedStatementLogProxy是java.sql.PreparedStatement的一個Proxy實現(xiàn)。

          因此要顯示執(zhí)行的SQL、參數(shù)、參數(shù)類型以及連接信息等需要配置兩個日志級別為DEBUG或者更低。

          對于log4j來說增加以下兩項就可以了(如果是properties文件的話,xml修改對應(yīng)規(guī)則):

          log4j.logger.java.sql.Connection=DEBUG
          log4j.logger.java.sql.PreparedStatement=DEBUG

           

          上面第二段代碼中如果看的夠仔細(xì)的話可以發(fā)現(xiàn)有一個ResultSetLogProxy的代理,配置這個相關(guān)的日志級別后可以輸出執(zhí)行結(jié)果信息。有興趣的可以看看吧。



          ©2009-2014 IMXYLZ |求賢若渴
          posted on 2010-12-05 15:17 imxylz 閱讀(3540) 評論(3)  編輯  收藏 所屬分類: J2EE

          評論

          # re: Ibatis 2.x日志記錄(SQL調(diào)試)分析 2010-12-09 09:52 mashiguang
          第2,3張圖片重復(fù)了。  回復(fù)  更多評論
            

          # re: Ibatis 2.x日志記錄(SQL調(diào)試)分析 2010-12-19 10:07 xylz
          @mashiguang
          多謝,已經(jīng)修復(fù)過來了  回復(fù)  更多評論
            

          # re: Ibatis 2.x日志記錄(SQL調(diào)試)分析 2014-10-23 21:16 y+
          請問樓主LOG4J是什么版本?  回復(fù)  更多評論
            


          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 乐都县| 卓资县| 遵化市| 桓仁| 福鼎市| 谷城县| 洱源县| 高碑店市| 桐柏县| 安岳县| 罗江县| 眉山市| 淮阳县| 民权县| 广饶县| 辉南县| 闻喜县| 聂荣县| 牟定县| 衡阳县| 吉林省| 凤山市| 长沙市| 四子王旗| 灵台县| 老河口市| 上饶市| 和平区| 安岳县| 城市| 樟树市| 上林县| 连南| 葫芦岛市| 海阳市| 桂平市| 文昌市| 万州区| 兴安县| 上蔡县| 会同县|