Stream ResultSet實現原理與應用實踐

2021-06-27 04:55:35 字數 1915 閱讀 4305

這篇我們來深入聊聊stream resultset的實現原理和應用實踐。

原理解析

stream resultset的實現方式mysql官方文件中沒有說明,這裡我們只有自食其力閱讀原始碼了。

首先和組內mysql大牛一起看了mysql select過程原始碼,這裡就不貼**了,直接說結論:mysql中沒有任何對stream resultset的特別處理,直接說mysql根本不知道有stream resultset這個東西也不足為過。

mysql server處理select語句的過程如下:

呼叫儲存引擎獲取下一行記錄

將獲取的記錄行按照mysql通訊協議編碼到乙個buffer(byte)中

編碼完這一行資料,如果buffer的length > max_buffer_length,則將這個buffer flush到網路中

回到第1個步驟

上述過程中,沒有任何狀態或標誌表示是否需要stream resultset,可以確定,stream resultset不像cursor,它的實現中沒有mysql通訊協議支援。mysql僅僅是按照自己的節奏不斷的把buffer寫回網路中。但是需要注意的是,第三個步驟中,flush buffer的過程是阻塞式的,也就是說如果網路中發生了擁塞,send buffer被填滿,會導致buffer一直flush不出去,那mysql的處理執行緒會一直卡在步驟3上,從而避免資料把客戶端記憶體撐爆。

resultsetimpl.next()

public

boolean next() throws sqlexception

if (this.doingupdates)

boolean b;

if (!reallyresult())

if (this.thisrow != null)

if (this.rowdata.size() == 0) else else

}setrowpositionvalidity();

return b;

}}

public boolean next ( ) throws sqlexception else else

if (this.nextrow != null)

}return

this.nextrow;

}public resultsetrow next ( ) throws sqlexception catch (exception e)

}}.start();

resultset rs = null;

try catch (sqlexception e) finally catch (sqlexception e) }}

}} finally

}}public class streambugtest catch ( exception e ) . start ( ) ;

resultset rs = null ;

try catch ( sqlexception e ) finally catch ( sqlexception e ) finally {

if ( con != null )

con . close ( ) ;

程式執行了5次,每次都在進入第二次迴圈後丟擲流方式異常。因為這個異常的異常碼為0,沒有什麼優雅的方式來識別,因此proxy對這個異常的態度是防範於未然,然而一旦出現,由於連線是不斷復用的,有問題的連線就會不斷丟擲流方式異常,導致相關請求無法執行。

因為之前一直不願意認定connector/j會有這樣的問題,所以查明原因繞了好久。目前我們的解決方案是,在網路瞬斷呼叫cancel後,關閉並丟棄所有相關連線。雖然會發生連線打穿,但是網路瞬斷並不是經常發生,這點代價可以接受。

這個問題在寫完這篇部落格後向官方反饋,希望可以在新版本中得到解決。

php堆排序實現原理與應用方法

這裡以php作為描述語言較詳細講解堆排序原理,因保證程式可讀性,故不做優化,php程式中關於堆的一些概念如下 假設n為當前陣列的key則,n的父節點為 n 1 或者 n 2 整除 n的左子節點l n 1 或 l n 2,n的右子節點r n 1 1 或 r l 1 arr array 1,8,7,2,...

SSH原理與應用

ssh是每一台linux電腦的標準配置。隨著linux裝置從電腦逐漸擴充套件到手機 外設和家用電器,ssh的使用範圍也越來越廣。不僅程式設計師離不開它,很多普通使用者也每天使用。雖然本文內容只涉及初級應用,較為簡單,但是需要讀者具備最基本的 shell知識 和了解 公鑰加密 的概念。如果你對它們不熟...

C STL nth element原理與應用

lz最近的考試中,某題可以通過呼叫nth element 來水過70 的資料 但是lz並不會啊 歷史總是驚人的相似 於是就有了這篇blog 在編寫 時,有時會有 在乙個無序表中快速得到第k小的元素 的需求 而直接排序 不能水過一些測試點 時間不能承受 於是stl的algorithm標頭檔案就給我們提...