我在寫一個數據庫庫,它必須智能地支持超時。現在,我期待在連接池,我特別擔心以下情形:如何防止對TCP套接字的延遲迴復?
- 發送查詢#1
- 超時ň秒後。
- 發送查詢#2
- 接收到查詢#1
第四步可能發生的響應,因爲查詢不與查詢ID標記:我所知道的是我收到的響應,我不知道它屬於哪個查詢。有人可能會認爲這在協議中構成了一個錯誤,但這不是我所能做到的。
在發送查詢#2之前,我該怎麼做才能避免這樣的延遲迴復?是唯一正確的方法shutdown()
,close()
和connect()
?
我在寫一個數據庫庫,它必須智能地支持超時。現在,我期待在連接池,我特別擔心以下情形:如何防止對TCP套接字的延遲迴復?
第四步可能發生的響應,因爲查詢不與查詢ID標記:我所知道的是我收到的響應,我不知道它屬於哪個查詢。有人可能會認爲這在協議中構成了一個錯誤,但這不是我所能做到的。
在發送查詢#2之前,我該怎麼做才能避免這樣的延遲迴復?是唯一正確的方法shutdown()
,close()
和connect()
?
恐怕這是操作連接的唯一安全方式,因爲沒有其他方法可以通過TCP在問答之間獲得一對一的關係。似乎缺乏某種類型的取消功能之間的某種。
該參考提供了更多的啓示:http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html
反過來,這是因爲TCP不知道你所謂的「查詢」,「響應」或「取消」。一個連接的插座只是兩個字節的單向管(Ted Stevens是對的)。如果一個人寫東西,而小河不上升,那麼另一端可以讀取它。因此,建立什麼「查詢」「響應」是「for」是應用程序級別的問題。它可以嵌入到定義查詢/響應的協議中,也可以不存在。 –
我的意思是,我知道。 :-)但是TCP確實有序列號,所以我希望有某種我可以利用的技巧。 –
@Andres:不幸的是,序列號只是讓TCP層組裝流 - 沒有什麼可以說相反方向上的特定字節之間經過了多少時間。請記住,僅僅因爲您發送第一個請求後經過了「n」秒,並不意味着自從另一端讀取它以來經過了「n」秒。所以另一端可能會在它的POV超時之前發送這個響應*,但它會在你的POV超時之後到達。超時本身可以與可靠的時間同步連接一起工作,而TCP不是。 –
怎麼樣增加常量來選擇所有查詢,以便您能庫識別查詢的響應是? – T3hc13h
這是一個好主意,但可惜對圖書館來說不是很好。也許通過一個插件... –