pos機(jī)器tcp超時(shí),深入了解JDBC超時(shí)機(jī)制

 新聞資訊  |   2023-03-29 08:51  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于pos機(jī)器tcp超時(shí),深入了解JDBC超時(shí)機(jī)制的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)器tcp超時(shí)的問題,今天pos機(jī)之家(www.dsth100338.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!

本文目錄一覽:

1、pos機(jī)器tcp超時(shí)

2、pos機(jī)連接超時(shí)怎么辦

3、簡述tcp擁塞避免算法的工作過程?

pos機(jī)器tcp超時(shí)

現(xiàn)象

數(shù)據(jù)庫出現(xiàn)各類問題和故障時(shí)候,例如連接數(shù)到達(dá)上限無法降低,數(shù)據(jù)庫宕機(jī),網(wǎng)絡(luò)出現(xiàn)故障導(dǎo)致數(shù)據(jù)庫無法訪問,這時(shí)候應(yīng)用服務(wù)器出現(xiàn)得不到連接,在數(shù)據(jù)庫重啟,或者主備切換,網(wǎng)絡(luò)恢復(fù)后,應(yīng)用服務(wù)器很多連接仍然無法恢復(fù),必須重啟應(yīng)用服務(wù)器才能解決。針對(duì)以上情況現(xiàn)需要對(duì)JDBC的超時(shí)問題做深入的分析,通過在應(yīng)用程序中配置恰當(dāng)?shù)?JDBC 超時(shí)時(shí)間來減少服務(wù)失敗的時(shí)間。

為什么我們需要知道 JDBC 驅(qū)動(dòng)

當(dāng)有性能問題或系統(tǒng)級(jí)錯(cuò)誤時(shí),應(yīng)用服務(wù)器和數(shù)據(jù)庫是我們關(guān)注的兩個(gè)重要層面。但應(yīng)用服務(wù)器和數(shù)據(jù)庫之間的部分會(huì)因?yàn)榈貌坏阶銐虻年P(guān)注而產(chǎn)生盲區(qū)。對(duì)于 java 應(yīng)用,這個(gè)盲區(qū)在數(shù)據(jù)庫連接池和 JDBC 之間,本文我們將重點(diǎn)討論 JDBC。

什么是 JDBC 驅(qū)動(dòng)

JDBC 是 Java 應(yīng)用程序中用于訪問數(shù)據(jù)庫的一套標(biāo)準(zhǔn) API,Sun 公司定義了四種類型的JDBC驅(qū)動(dòng)。我司主要用的是第4種,該類型驅(qū)動(dòng)由純 Java 語言編寫,在 Java 應(yīng)用中通過 socket 與數(shù)據(jù)庫通信。

圖1: 類型4驅(qū)動(dòng)

類型4驅(qū)動(dòng)是通過 socket 來處理字節(jié)流的,它的基本操作和 HttpClient 這種網(wǎng)絡(luò)操作類庫相同。同其他網(wǎng)絡(luò)類庫一樣,也會(huì)在發(fā)生超時(shí)的時(shí)候占用大量的 CPU 資源從而失去響應(yīng)。如果你之前用過 HttpClient ,肯定遇到過因?yàn)闆]有設(shè)置超時(shí)導(dǎo)致的錯(cuò)誤。如果 socket 超時(shí)設(shè)置不合適,類型4驅(qū)動(dòng)也可能有同樣的錯(cuò)誤(連接被阻塞)。

下面讓我們了解如何配置 JDBC 驅(qū)動(dòng)的 socket 超時(shí),以及設(shè)置時(shí)需考慮哪些問題。

WAS 與數(shù)據(jù)庫間的設(shè)置超時(shí)的層次

圖2: 超時(shí)的層次

圖2展示了簡化的 WAS 和數(shù)據(jù)庫通信時(shí)的超時(shí)層次。

更上層的超時(shí)依賴于下層的超時(shí),只有當(dāng)較低層的超時(shí)機(jī)制正常工作,上層的超時(shí)才會(huì)正常。如果 JDBC 驅(qū)動(dòng)程序的 socket 超時(shí)工作不正常,那么更上層的超時(shí)比如 statement 超時(shí)和事務(wù)超時(shí)都不會(huì)正常工作。

這就說明了為何有時(shí)候即使配置了 Statement 超時(shí),應(yīng)用程序還是不能從故障中恢復(fù),因?yàn)?Statement 超時(shí)在網(wǎng)絡(luò)故障時(shí)不起作用。

它只能做到:限制一次Statement 執(zhí)行的時(shí)間,處理超時(shí)以防網(wǎng)絡(luò)故障必須由 JDBC 驅(qū)動(dòng)來做。

JDBC 驅(qū)動(dòng)的 socket 超時(shí)還會(huì)受操作系統(tǒng)的 socket 超時(shí)配置的影響。這解釋了有的時(shí)候 JDBC 連接在網(wǎng)絡(luò)故障后阻塞了30分鐘還能恢復(fù),即使沒配置 JDBC 驅(qū)動(dòng)的 socket 超時(shí)。

DBCP 連接池位于圖2的左邊。你會(huì)發(fā)現(xiàn)各種層面的超時(shí)與 DBCP 是分開的。DBCP 負(fù)責(zé)數(shù)據(jù)庫連接(即本文中說到的Connection)的創(chuàng)建和管理,并不涉及超時(shí)的處理。當(dāng)在 DBCP 中創(chuàng)建了一個(gè)數(shù)據(jù)庫連接或發(fā)送了一條查詢校驗(yàn)的 sql 語句用于檢查連接有效性時(shí),socket 超時(shí)會(huì)影響這些過程的處理,但并不直接影響應(yīng)用程序。

然而在應(yīng)用程序中調(diào)用 DBCP 的 getConnection() 方法時(shí),你能指定應(yīng)用程序獲取數(shù)據(jù)庫連接的超時(shí)時(shí)間,但這和 JDBC 的連接超時(shí)無關(guān)。

圖3: 每一層級(jí)的超時(shí)

什么是事務(wù)超時(shí)

事務(wù)超時(shí)是在Spring框架或應(yīng)用程序?qū)用嫔喜庞行У某瑫r(shí)。

事務(wù)超時(shí)可能是個(gè)不常見的概念。簡單講,事務(wù)超時(shí)等于 Statement 超時(shí) * N(需要執(zhí)行的 Statement 的數(shù)量) + 其它(垃圾回收等其他時(shí)間)。事務(wù)超時(shí)被用來限制執(zhí)行一個(gè)事務(wù)之內(nèi)所有 Statement 執(zhí)行的總時(shí)長。

假設(shè)一個(gè)事務(wù)里有5條 Statement ,每條 Statement 執(zhí)行時(shí)間是200毫秒,其它業(yè)務(wù)邏輯或框架操作的執(zhí)行時(shí)間是100毫秒,那事務(wù)允許的超時(shí)時(shí)間至少應(yīng)該1100毫秒(200 * 5 + 100)。


Spring 提供的事務(wù)超時(shí)的配置非常簡單,它會(huì)記錄每個(gè)事務(wù)的開始時(shí)間和消耗時(shí)間,當(dāng)特定的事件發(fā)生時(shí)會(huì)對(duì)已消耗掉的時(shí)間做校驗(yàn),如果超出了配置將拋出異常。

Spring 中數(shù)據(jù)庫連接被保存在線程本地變量(ThreadLocal)中,這被稱作事務(wù)同步(Transaction Synchronization)。當(dāng)數(shù)據(jù)庫連接被保存到 ThreadLocal 時(shí),同時(shí)會(huì)記錄事務(wù)的開始時(shí)間和超時(shí)時(shí)間。所以通過數(shù)據(jù)庫連接的代理創(chuàng)建的 Statement 在執(zhí)行時(shí)就會(huì)校驗(yàn)這個(gè)時(shí)間。

什么是 Statement 超時(shí)

Statement 超時(shí)是用來限制 Statement 的執(zhí)行時(shí)間的,它的具體值是通過 JDBC API 來設(shè)置的。JDBC 驅(qū)動(dòng)程序基于這個(gè)值進(jìn)行 Statement 執(zhí)行時(shí)的超時(shí)處理。Statement 超時(shí)是通過 JDBC API 中java.sql.Statement 類的 setQueryTimeout(int timeout) 方法配置的。不過現(xiàn)在的開發(fā)者已經(jīng)很少直接在代碼中配置它了,更多是通過框架來進(jìn)行設(shè)置。

以 iBatis 為例,可以通過 SqlMapConfig.xml 中的 setting 屬性defaultStatementTimeout 來設(shè)置全局的 statement 超時(shí)缺省值。你也可以通過在具體的 sql 映射文件中的 select insert update 標(biāo)簽的 statement 屬性來覆蓋。

MySql (5.X 中的 Statement 超時(shí)處理)

調(diào)用 Connection 的 createStatement() 方法創(chuàng)建一個(gè) Statement 對(duì)象調(diào)用 Statement 的 executeQuery() 方法Statement 對(duì)象通過內(nèi)部的 Connection 對(duì)象將查詢命令傳輸?shù)?MySql 數(shù)據(jù)庫Statement 創(chuàng)建一個(gè)新的超時(shí)執(zhí)行線程(timeout-execution)來處理超時(shí)5.1以上版本改為每個(gè)連接分配一個(gè)線程向 timeout-execution 線程注冊(cè)當(dāng)前的 Statement 對(duì)象發(fā)生超時(shí)timeout-execution 線程創(chuàng)建一個(gè)相同配置的 Connection 對(duì)象用新創(chuàng)建的 Connection 發(fā)送取消查詢的命令

圖4 MySQL 的 Statement 超時(shí)執(zhí)行過程


什么是 Socket 超時(shí)

類型4的 JDBC 驅(qū)動(dòng)是用 socket 方式與數(shù)據(jù)庫連接的,應(yīng)用程序和數(shù)據(jù)庫之間的連接超時(shí)并不是由數(shù)據(jù)庫處理的。

當(dāng)數(shù)據(jù)庫突然宕掉或發(fā)生網(wǎng)絡(luò)錯(cuò)誤(設(shè)備故障等)時(shí),JDBC 驅(qū)動(dòng)的 socket 超時(shí)的值是必須的。由于 TCP/IP 的結(jié)構(gòu),socket 沒有辦法檢測到網(wǎng)絡(luò)錯(cuò)誤,因此應(yīng)用不能檢測到與數(shù)據(jù)庫到連接斷開了。如果沒有設(shè)置 socket 超時(shí),應(yīng)用程序會(huì)一直等待數(shù)據(jù)庫返回結(jié)果。(這個(gè)連接也被叫做“死連接”) 為了避免死連接,socket 必須要設(shè)置超時(shí)時(shí)間。socket 超時(shí)可以通過 JDBC 驅(qū)動(dòng)程序配置。通過設(shè)置 socket 超時(shí),可以防止出現(xiàn)網(wǎng)絡(luò)錯(cuò)誤時(shí)一直等待的情況并縮短故障時(shí)間。

不推薦使用 socket 超時(shí)來限制一個(gè) statement 的執(zhí)行時(shí)間,因此socket 超時(shí)的值必須要高于 statement 的超時(shí)時(shí)間,否則 socket 超時(shí)將會(huì)先生效,這樣 statement 超時(shí)就沒有意義,也無法生效。

下面展示了 socket 超時(shí)設(shè)置的連個(gè)選項(xiàng),其配置因不同的驅(qū)動(dòng)而異。

socket 連接時(shí)的超時(shí):通過 Socket 對(duì)象的 connect(SocketAddress endpoint, int timeout) 方法來配置socket 讀寫時(shí)的超時(shí):通過 Socket 對(duì)象的 setSoTimeout(int timeout) 方法來配置

下面列出了如何MySQL配置 socket 超時(shí)

連接超時(shí)配置: connectTimeout(默認(rèn)值:0,單位:毫秒)

socket 超時(shí)配置: socketTimeout(默認(rèn)值:0,單位:ms)

JDBC Url 格式:jdbc:mysql://[host:port],[host:port].../[database]
[?propertyName1][=propertyValue1][&propertyName2][=prop

connectTimeout 和 socketTimeout 的默認(rèn)值是 0 ,這意味著不會(huì)發(fā)生超時(shí)。

操作系統(tǒng)層面的 socket 超時(shí)配置

如果沒設(shè)置 socket 超時(shí)或連接超時(shí),應(yīng)用程序多數(shù)情況下無法檢測到網(wǎng)絡(luò)錯(cuò)誤。此時(shí),應(yīng)用程序?qū)⒁恢钡却氯ィ钡竭B接上數(shù)據(jù)庫或能讀取到數(shù)據(jù)。然而,遇到的實(shí)際情況會(huì)發(fā)現(xiàn)問題常常在在應(yīng)用程序在30分鐘后嘗試重新連接到網(wǎng)絡(luò)后被解決了。這是因?yàn)椴僮飨到y(tǒng)也配置了 socket 超時(shí)時(shí)間。Linux 服務(wù)器將 socket 超時(shí)時(shí)間設(shè)置為30分鐘。它將在操作系統(tǒng)層面對(duì)網(wǎng)絡(luò)連接做校驗(yàn)。

通常,應(yīng)用程序會(huì)在調(diào)用 socket 的 read() 方法時(shí)由于網(wǎng)絡(luò)問題而阻塞住。然而很少在調(diào)用 socket 的 write() 方法時(shí)處于等待狀態(tài),這取決于網(wǎng)絡(luò)構(gòu)成和錯(cuò)誤類型。當(dāng)應(yīng)用程序調(diào)用 socket 的 write() 方法時(shí),數(shù)據(jù)被記錄到操作系統(tǒng)的內(nèi)核緩沖區(qū),然后將控制權(quán)立即交還給應(yīng)用程序。因此,一旦數(shù)據(jù)已經(jīng)寫入內(nèi)核緩沖區(qū),socket.write() 的調(diào)用始終是成功。但是,如果操作系統(tǒng)內(nèi)核緩沖區(qū)由于特殊的網(wǎng)絡(luò)錯(cuò)誤而滿了的話,socket.write() 也會(huì)進(jìn)入等待狀態(tài)。這種情況下,操作系統(tǒng)會(huì)嘗試重新發(fā)送數(shù)據(jù)包一段時(shí)間,并在達(dá)到超時(shí)限制時(shí)產(chǎn)生錯(cuò)誤。

最后列出以下重點(diǎn):

建議研發(fā)需要配置的超時(shí)包括:

sqlMap里的全局jdbcTimeout。視場景在sqlMap文件里單個(gè)語句中也可以設(shè)的jdbcTimeout,優(yōu)先級(jí)高于全局的。針對(duì)MySql驅(qū)動(dòng)在jboss控制臺(tái)配置JDBC URL后面加connectTimeout,socketTimeout,但需要保證比Statemant級(jí)別的超時(shí)設(shè)置要長。數(shù)據(jù)庫層面的wait_timeout建議半小時(shí)容器里需要注意配取數(shù)據(jù)連接的驗(yàn)證,如下圖:

pos機(jī)連接超時(shí)怎么辦

通常是網(wǎng)絡(luò)信號(hào)的問題,一般出現(xiàn)這種情況就是機(jī)器里面的sim卡賣卜么有流量了,你可以嘗試換一張自己的卡,移動(dòng)或者聯(lián)通,帶有GPRS流量的卡,爛配皮放進(jìn)去然后重啟一饑差下機(jī)器試試,如果還是不行清聯(lián)系服務(wù)商進(jìn)行更換專用SIM卡。不懂可以咨詢

簡述tcp擁塞避免算法的工作過程?

1、慢開始和擁塞避免

基于窗口的擁塞控制,在發(fā)送方維護(hù)一個(gè)擁塞窗口(cwnd),大小等于發(fā)送窗口,通過出現(xiàn)了超時(shí)來判斷網(wǎng)絡(luò)出現(xiàn)擁塞。慢開始的思路是一開始發(fā)送方發(fā)送一個(gè)字節(jié),在收到接收方的確認(rèn),然后發(fā)送的字節(jié)數(shù)量增大一倍(也就是按照指數(shù)增長的速率),從小到大逐步增大cwnd,直到cwnd 達(dá)到慢開始門限(ssthresh),停止慢開始算法,使用擁塞避免算法,擁塞避免算法思路是增長速率變?yōu)榫€性增長,也就是每經(jīng)過一個(gè)往返時(shí)間RTT就把發(fā)送方的cwnd加1,所以綜上:

當(dāng)cwnd < ssthresh ,使用慢開始算法;

當(dāng)cwnd = ssthresh,可以使用慢開始算法,也可以使用擁塞算法;

當(dāng)cwnd > ssthresh,使用擁塞算法;

2、快重傳和快恢復(fù)

通過上面兩個(gè)算法可以使得網(wǎng)絡(luò)傳輸速率一直增大,直到出現(xiàn)超時(shí),這時(shí)候需要將cwnd重新調(diào)整到1個(gè)字節(jié)開始,使用慢開始算法,同時(shí)需要將慢開始門限ssthresh調(diào)整為cwnd(超時(shí)點(diǎn))的一半,繼續(xù)執(zhí)行慢開始、擁塞避免算法。如果收到3-ACK(發(fā)送方一連接收到3個(gè)對(duì)同一個(gè)報(bào)文段的重復(fù)確認(rèn)),這種可能的情況是,并不是發(fā)生了擁塞,可能是報(bào)文丟失,所以發(fā)送方不執(zhí)行慢開始算法,直接使用快重傳算法,立即發(fā)送缺失的報(bào)文段。同時(shí)執(zhí)行快恢復(fù)算法,將門限值(ssthresh)調(diào)整為此時(shí)cwnd的一半,并執(zhí)行擁塞避免算法。

以上就是關(guān)于pos機(jī)器tcp超時(shí),深入了解JDBC超時(shí)機(jī)制的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)器tcp超時(shí)的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://www.dsth100338.com/news/12850.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。