象其他數(shù)據(jù)系統(tǒng)一樣SQL Anywhere在執(zhí)行sql語(yǔ)句的時(shí)候會(huì)維持一個(gè)db handle,當(dāng)語(yǔ)句結(jié)束調(diào)用結(jié)束后釋放這個(gè)handle.我們?cè)陂_(kāi)發(fā)過(guò)程成往往會(huì)忘記去釋放這個(gè)handle或者異常發(fā)生后沒(méi)有對(duì)它進(jìn)行有效的處理,而造成超出連接級(jí)數(shù)據(jù)庫(kù)屬性Max_statement_count 的設(shè)定值,進(jìn)而引起數(shù)據(jù)庫(kù)拋錯(cuò)誤信息.接下來(lái)就這個(gè)問(wèn)題進(jìn)行分析.
一、如何做到始終釋放open的handle
在處理db的框架中每個(gè)處理函數(shù)都應(yīng)該象下面一樣處理
try
{
//execute sql
}
catch(...)
{
}
finally
{
//handle dispose codes snippet
}
二、如何通過(guò)配置db啟動(dòng)選項(xiàng)來(lái)找到你犯的錯(cuò)
sybase提供了一些很好的啟動(dòng)參數(shù)可以讓你抓出你想要的sql log,這里我只介紹 -zr 和 -zo
1.-zr
語(yǔ)法:
-zr { all | SQL | none | SQL+hostvars } ...
可取值 ALL、SQL、NONE 或 SQL+hostvar。ON 和 ALL 是等效的。OFF 和 NONE 是等效的。此調(diào)用對(duì)發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器的各 SQL 語(yǔ)句啟用日志,以便用于疑難解答,此選項(xiàng)同數(shù)據(jù)庫(kù)服務(wù)器選項(xiàng) -zr 和 -zo 一起使用。
如果將 -zr設(shè)置為 OFF,則會(huì)關(guān)閉請(qǐng)求日志文件。
如果選擇 SQL,則僅記錄以下類(lèi)型的請(qǐng)求:
START DATABASE
STOP ENGINE
STOP DATABASE
語(yǔ)句準(zhǔn)備
語(yǔ)句執(zhí)行
EXECUTE IMMEDIATE 語(yǔ)句
選項(xiàng)設(shè)置
COMMIT 語(yǔ)句
ROLLBACK 語(yǔ)句
PREPARE TO COMMIT 操作
連接
斷開(kāi)連接
事務(wù)開(kāi)頭
DROP STATEMENT 語(yǔ)句
游標(biāo)解釋
游標(biāo)關(guān)閉
游標(biāo)重新開(kāi)始
錯(cuò)誤
將 -zr 設(shè)置為 SQL+hostvar 時(shí)將在日志中輸出 SQL和 主機(jī)變量值。
使用 property('RequestLogging') 可以得到 -zr 設(shè)置的當(dāng)前值。
2.-zo
語(yǔ)法:
-zo filename...
將請(qǐng)求記錄信息重定向到與常規(guī)日志文件不同的文件中
三、通過(guò)得到的log文件得到你未釋放的handle

log 片斷
1
+1,<,2,PREPARE,SELECT * FROM Temp
2
+3,>,2,PREPARE,131267
3
+22,<,2,OPEN,131267
4
+23,>,2,OPEN,65732
5
+6,<,2,COMMIT
6
+1,>.,2
7
+11,W,2,100,Row not found
8
+58,<,2,CLOSE,65732
9
+1,I,2,1,1,0,NOSCROLL*+READONLY+HOLD
10
+1,>,2,CLOSE
11
+3,<,2,COMMIT
12
+1,>.,2
13
+37,<,2,DROP_STMT,131267
14
+1,>,2,DROP_STMT
每一個(gè)handle必須經(jīng)過(guò)Prepare->Drop_Stmt這個(gè)過(guò)程,而如果我們?cè)诖a中忘記釋放handle的話log中是不會(huì)有對(duì)應(yīng)的DROP_STMT語(yǔ)句的。
可以通過(guò)Prepare后的句柄號(hào)來(lái)查找對(duì)應(yīng)的DROP_STMT語(yǔ)句(如代碼中的第2行和第37行),如果沒(méi)找到的話那可以查看對(duì)應(yīng)的sql語(yǔ)句從而找到對(duì)應(yīng)的代碼。
整理的比較倉(cāng)促,如有考慮不周指出請(qǐng)幫我指出。同時(shí)希望這篇文章對(duì)你有所幫助。