久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

共計(jì) 6643 個(gè)字符,預(yù)計(jì)需要花費(fèi) 17 分鐘才能閱讀完成。

本篇文章為大家展示了如何有效地跟蹤 Bug 記錄帶有詳細(xì)參數(shù)值的 SQL,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

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

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

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

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

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

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

log4jdbc 主頁

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))

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

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

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

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

http://usc.googlecode.com/svn/SSHWithAnnotationDemoUselog4jdbc/)。

jdbcdslog 主頁

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
>

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

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

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

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

注:個(gè)人覺得不友好的地方是:雖然參數(shù)都已經(jīng)寫的很清晰了,但是這個(gè)語句并不能地直接使用(拿這個(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 主頁

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

配置樣例

這個(gè)就不貼了,因?yàn)?jdbcdslog-exp 并沒有修改 jdbcdslog 的配置,使用它的配置就可以了。不過增強(qiáng)功能的會(huì)需要少少配置,下面再說。

效果

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

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

新特性和如何使用

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

數(shù)據(jù)庫的不同,生成的 SQL 會(huì)有些不同,比如關(guān)鍵詞(特殊字符),在 Oracle 中有 and and \r, \n,\t,SQL Server 中有,
Mysql 中有 and and \ and \r,\n,\t(注:考慮過 like 語句中的特殊字符,不過 jdbcdslog-exp 并沒有實(shí)現(xiàn),這部分,一則我覺得使用率比較少,一則如果真的有的話,注意下應(yīng)該也不是那么困難。),再比如日期格式。那么如何更改數(shù)據(jù)庫類型來選擇合適的生成語句,請(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)然你可以通過下面的配置顯示出來。

同樣在 jdbcdslog.properties 文件中配置

#jdbcdslog will show elapsed time

jdbcdslog.showTime=true

3)Maven 的支持

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

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

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

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

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

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

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

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

不過你不用擔(dān)心,這種情況還是比較少出現(xiàn)的,還不影響正常的使用(開發(fā)階段)的。如果您知道為什么會(huì)出現(xià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 中只需要開 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

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

上述內(nèi)容就是如何有效地跟蹤 Bug 記錄帶有詳細(xì)參數(shù)值的 SQL,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-28發(fā)表,共計(jì)6643字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 岫岩| 加查县| 东山县| 台南市| 米脂县| 芦溪县| 贡觉县| 突泉县| 潞城市| 轮台县| 瓮安县| 武夷山市| 襄城县| 彰化县| 土默特右旗| 阳泉市| 仙居县| 绥阳县| 丹凤县| 阿图什市| 黄山市| 德州市| 曲松县| 兴业县| 勐海县| 遂宁市| 赤壁市| 南雄市| 龙口市| 图片| 固原市| 墨竹工卡县| 平罗县| 莱州市| 财经| 浠水县| 达日县| 新民市| 宜都市| 沧州市| 开鲁县|