国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql多次調用存儲過程的問題

2024-07-24 12:44:25
字體:
來源:轉載
供稿:網友
問題是這樣的,在直接使用mysql c api構建應用的時候,一個連接只能執行一次存儲過程,不管怎樣free再次利用這個連接的時候就會出現不能執行qurry的提示,我想,這么大型的軟件 不會存在這樣的基礎性問題吧,畢竟大多數的adodb都是基于c api的,難道所有的軟件都無法進行連接緩存?

別說,接觸到這類問題的人還真不多,大多數的連接池都寫好了,誰會去直接構建連接進行操作呢,所以baidu google基本都沒有結果,今天回頭來解決這個問題,突然就有了突破,找到了一篇文章《對Mysql的C API調用存儲過程的問題及解決方法分析》,正是我的問題。
作者分析的挺復雜了,其實我們一般只用mysql_query、mysql_use_result等幾個函數,問題的癥結在于當執行一個存儲過程的時候, 數據庫返回的是多個數據集合,即使只有一個數據集合,他也會有一個空集合用于結束一次回話,作者罵他變態,其實不然,可能作者考慮到的只是一般的請 求,mysql是給所有用戶使用的,說不能真有變態的人把圖片文件等等直接保存在mysql字段里面,那么回復就不可能一次完成,需要多此網絡交互,那么 所有的交互肯定需要一個結束符號,并且存儲過程本來就可以返回多個數據集合,如果他在c pai中只做一個結果己處理就允許下一次全新的請求,那么對于同一連接,在mysql服務斷其實還有沒有發送完成的數據,這個時候他安全的做法就是不接受 任何新的請求,直到數據發送完全,或者連接關閉,不然,mysql協議解析就會出現問題,下次發送就會出現黏包或者丟包,所以他的做法是完全正確的,即使 只有一個結果集合,也需要當前會話內的通訊(比如mysql_next_result)確認完畢,然后結束本次請求,這個時候服務端其實沒有數據了,但是 這個過程是不能省略的,然后在不關閉連接的情況下就可以進行全新的請求了。
所以總結起來就是:使用存儲過程的時候一定要循環執行,把所有的結果集合都取到,直到為空,這個時候當前數據庫連接才可以安全歸還回去,下面是demo。
復制代碼 代碼如下:

MYSQL_RES *conn;
MYSQL_RES *res;
MYSQL_ROW row;
conn = 連接池.Get("xxxx");

mysql_query(conn, "call qt()");

res = mysql_use_result(conn);
while ((row = mysql_fetch_row(res))) {
do main thins; //這次是對于第一個數據集的處理
}
mysql_free_result(res);
while ((res = mysql_next_result(conn)) != NULL) {
do some thing; //循環處理其他的數據集
mysql_free_result(res);
}
連接池.Free(conn)

經過上面的循環讀取就能夠保證一條連接會干凈地歸還到連接池,當然有的連接池可能已經把后面一個循環放在連接池中處理了,解釋說把剩余的數據集全部取過來然后釋放,這樣比如在php等里面使用mysql的連接池的時候就沒有感受到上面說的問題。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安宁市| 钟祥市| 闵行区| 富川| 迁安市| 宁乡县| 石棉县| 安福县| 乌拉特前旗| 陆良县| 鱼台县| 井冈山市| 玛多县| 西乌| 房产| 达拉特旗| 兰溪市| 建瓯市| 新沂市| 长阳| 扶风县| 清远市| 高阳县| 蒙阴县| 扎赉特旗| 阿克| 连州市| 东乡族自治县| 城步| 东乌珠穆沁旗| 兴海县| 工布江达县| 松溪县| 临朐县| 通榆县| 高淳县| 福鼎市| 聂拉木县| 黑河市| 沧源| 竹北市|