xylz,imxylz

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

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

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

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

          ibatis-log

          執(zhí)行步驟如下:

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

          我們看三段代碼:

           

           

           

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

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

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

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

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

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

           

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



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

          評(píng)論

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

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

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


          ©2009-2014 IMXYLZ
          主站蜘蛛池模板: 霍城县| 湖南省| 会泽县| 凤城市| 远安县| 郧西县| 曲阳县| 宾阳县| 城固县| 兴隆县| 桐柏县| 德庆县| 壤塘县| 莫力| 景宁| 尖扎县| 云和县| 庆安县| 常山县| 杭锦后旗| 武夷山市| 临海市| 彰化县| 中山市| 福安市| 东辽县| 靖边县| 河南省| 焉耆| 榆林市| 广州市| 普陀区| 吉隆县| 旌德县| 当雄县| 马边| 闻喜县| 延津县| 谷城县| 江川县| 宣威市|