mysql多次呼叫儲存過程的問題
問題是這樣的,在直接使用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的連線池的時候就沒有感受到上面說的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4822/viewspace-2803800/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql如何呼叫儲存過程MySql儲存過程
- MySQL儲存過程的許可權問題MySql儲存過程
- MySQL儲存過程語句及呼叫MySql儲存過程
- 呼叫儲存過程儲存過程
- linux呼叫儲存過程Linux儲存過程
- Winform呼叫儲存過程ORM儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- Sqlsugar呼叫Oracle的儲存過程SqlSugarOracle儲存過程
- mysql 儲存過程MySql儲存過程
- jsp中呼叫儲存過程JS儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- MySQL之儲存過程MySql儲存過程
- MySQL---------儲存過程MySql儲存過程
- mysql儲存過程整理MySql儲存過程
- mssql 儲存過程呼叫另一個儲存過程中的結果的方法分享SQL儲存過程
- mysql儲存過程的引數MySql儲存過程
- 達夢儲存過程效能問題定位儲存過程
- mysql無法建立儲存過程問題 ERROR 1307 (HY000)MySql儲存過程Error
- Oracle 儲存過程分頁 + Sqlsugar呼叫Oracle儲存過程SqlSugar
- mysql和orcale的儲存過程和儲存函式MySql儲存過程儲存函式
- Mysql 5.7儲存過程的學習MySql儲存過程
- MySQL儲存過程的建立和使用MySql儲存過程
- Springboot呼叫Oracle儲存過程的幾種方式Spring BootOracle儲存過程
- 儲存過程訪問其他使用者的表的問題儲存過程
- MySQL儲存過程 (即函式)MySql儲存過程函式
- mySql 儲存過程與函式MySql儲存過程函式
- Laravel 中使用 MySQL 儲存過程LaravelMySql儲存過程
- MySql資料庫——儲存過程MySql資料庫儲存過程
- MySQL 儲存過程和函式MySql儲存過程函式
- MySQL儲存過程和函式MySql儲存過程函式
- ibatis呼叫oracle儲存過程(極簡版)BATOracle儲存過程
- jdbc使用call呼叫儲存過程報錯JDBC儲存過程
- MySQL的寫入資料儲存過程MySql儲存過程
- MySQL儲存過程中如何使用ROLLBACKMySql儲存過程
- MySQL--儲存過程與檢視MySql儲存過程
- mysql 儲存過程 procedure 批次建表MySql儲存過程
- MySQL入門--儲存過程(PROCEDURE)和儲存函式(FUNCTION)MySql儲存過程儲存函式Function
- MySQL的物理儲存結構和session過程MySqlSession