網(wǎng)上有很多關(guān)于pos機器tcp超時,深入了解JDBC超時機制的知識,也有很多人為大家解答關(guān)于pos機器tcp超時的問題,今天pos機之家(m.afbey.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
pos機器tcp超時
現(xiàn)象:
數(shù)據(jù)庫出現(xiàn)各類問題和故障時候,例如連接數(shù)到達(dá)上限無法降低,數(shù)據(jù)庫宕機,網(wǎng)絡(luò)出現(xiàn)故障導(dǎo)致數(shù)據(jù)庫無法訪問,這時候應(yīng)用服務(wù)器出現(xiàn)得不到連接,在數(shù)據(jù)庫重啟,或者主備切換,網(wǎng)絡(luò)恢復(fù)后,應(yīng)用服務(wù)器很多連接仍然無法恢復(fù),必須重啟應(yīng)用服務(wù)器才能解決。針對以上情況現(xiàn)需要對JDBC的超時問題做深入的分析,通過在應(yīng)用程序中配置恰當(dāng)?shù)?JDBC 超時時間來減少服務(wù)失敗的時間。
為什么我們需要知道 JDBC 驅(qū)動
當(dāng)有性能問題或系統(tǒng)級錯誤時,應(yīng)用服務(wù)器和數(shù)據(jù)庫是我們關(guān)注的兩個重要層面。但應(yīng)用服務(wù)器和數(shù)據(jù)庫之間的部分會因為得不到足夠的關(guān)注而產(chǎn)生盲區(qū)。對于 java 應(yīng)用,這個盲區(qū)在數(shù)據(jù)庫連接池和 JDBC 之間,本文我們將重點討論 JDBC。
什么是 JDBC 驅(qū)動
JDBC 是 Java 應(yīng)用程序中用于訪問數(shù)據(jù)庫的一套標(biāo)準(zhǔn) API,Sun 公司定義了四種類型的JDBC驅(qū)動。我司主要用的是第4種,該類型驅(qū)動由純 Java 語言編寫,在 Java 應(yīng)用中通過 socket 與數(shù)據(jù)庫通信。
圖1: 類型4驅(qū)動
類型4驅(qū)動是通過 socket 來處理字節(jié)流的,它的基本操作和 HttpClient 這種網(wǎng)絡(luò)操作類庫相同。同其他網(wǎng)絡(luò)類庫一樣,也會在發(fā)生超時的時候占用大量的 CPU 資源從而失去響應(yīng)。如果你之前用過 HttpClient ,肯定遇到過因為沒有設(shè)置超時導(dǎo)致的錯誤。如果 socket 超時設(shè)置不合適,類型4驅(qū)動也可能有同樣的錯誤(連接被阻塞)。
下面讓我們了解如何配置 JDBC 驅(qū)動的 socket 超時,以及設(shè)置時需考慮哪些問題。
WAS 與數(shù)據(jù)庫間的設(shè)置超時的層次
圖2: 超時的層次
圖2展示了簡化的 WAS 和數(shù)據(jù)庫通信時的超時層次。
更上層的超時依賴于下層的超時,只有當(dāng)較低層的超時機制正常工作,上層的超時才會正常。如果 JDBC 驅(qū)動程序的 socket 超時工作不正常,那么更上層的超時比如 statement 超時和事務(wù)超時都不會正常工作。
這就說明了為何有時候即使配置了 Statement 超時,應(yīng)用程序還是不能從故障中恢復(fù),因為 Statement 超時在網(wǎng)絡(luò)故障時不起作用。
它只能做到:限制一次Statement 執(zhí)行的時間,處理超時以防網(wǎng)絡(luò)故障必須由 JDBC 驅(qū)動來做。
JDBC 驅(qū)動的 socket 超時還會受操作系統(tǒng)的 socket 超時配置的影響。這解釋了有的時候 JDBC 連接在網(wǎng)絡(luò)故障后阻塞了30分鐘還能恢復(fù),即使沒配置 JDBC 驅(qū)動的 socket 超時。
DBCP 連接池位于圖2的左邊。你會發(fā)現(xiàn)各種層面的超時與 DBCP 是分開的。DBCP 負(fù)責(zé)數(shù)據(jù)庫連接(即本文中說到的Connection)的創(chuàng)建和管理,并不涉及超時的處理。當(dāng)在 DBCP 中創(chuàng)建了一個數(shù)據(jù)庫連接或發(fā)送了一條查詢校驗的 sql 語句用于檢查連接有效性時,socket 超時會影響這些過程的處理,但并不直接影響應(yīng)用程序。
然而在應(yīng)用程序中調(diào)用 DBCP 的 getConnection() 方法時,你能指定應(yīng)用程序獲取數(shù)據(jù)庫連接的超時時間,但這和 JDBC 的連接超時無關(guān)。
圖3: 每一層級的超時
什么是事務(wù)超時
事務(wù)超時是在Spring框架或應(yīng)用程序?qū)用嫔喜庞行У某瑫r。
事務(wù)超時可能是個不常見的概念。簡單講,事務(wù)超時等于 Statement 超時 * N(需要執(zhí)行的 Statement 的數(shù)量) + 其它(垃圾回收等其他時間)。事務(wù)超時被用來限制執(zhí)行一個事務(wù)之內(nèi)所有 Statement 執(zhí)行的總時長。
假設(shè)一個事務(wù)里有5條 Statement ,每條 Statement 執(zhí)行時間是200毫秒,其它業(yè)務(wù)邏輯或框架操作的執(zhí)行時間是100毫秒,那事務(wù)允許的超時時間至少應(yīng)該1100毫秒(200 * 5 + 100)。
Spring 提供的事務(wù)超時的配置非常簡單,它會記錄每個事務(wù)的開始時間和消耗時間,當(dāng)特定的事件發(fā)生時會對已消耗掉的時間做校驗,如果超出了配置將拋出異常。
Spring 中數(shù)據(jù)庫連接被保存在線程本地變量(ThreadLocal)中,這被稱作事務(wù)同步(Transaction Synchronization)。當(dāng)數(shù)據(jù)庫連接被保存到 ThreadLocal 時,同時會記錄事務(wù)的開始時間和超時時間。所以通過數(shù)據(jù)庫連接的代理創(chuàng)建的 Statement 在執(zhí)行時就會校驗這個時間。
什么是 Statement 超時
Statement 超時是用來限制 Statement 的執(zhí)行時間的,它的具體值是通過 JDBC API 來設(shè)置的。JDBC 驅(qū)動程序基于這個值進(jìn)行 Statement 執(zhí)行時的超時處理。Statement 超時是通過 JDBC API 中java.sql.Statement 類的 setQueryTimeout(int timeout) 方法配置的。不過現(xiàn)在的開發(fā)者已經(jīng)很少直接在代碼中配置它了,更多是通過框架來進(jìn)行設(shè)置。
以 iBatis 為例,可以通過 SqlMapConfig.xml 中的 setting 屬性defaultStatementTimeout 來設(shè)置全局的 statement 超時缺省值。你也可以通過在具體的 sql 映射文件中的 select insert update 標(biāo)簽的 statement 屬性來覆蓋。
MySql (5.X 中的 Statement 超時處理)
調(diào)用 Connection 的 createStatement() 方法創(chuàng)建一個 Statement 對象調(diào)用 Statement 的 executeQuery() 方法Statement 對象通過內(nèi)部的 Connection 對象將查詢命令傳輸?shù)?MySql 數(shù)據(jù)庫Statement 創(chuàng)建一個新的超時執(zhí)行線程(timeout-execution)來處理超時5.1以上版本改為每個連接分配一個線程向 timeout-execution 線程注冊當(dāng)前的 Statement 對象發(fā)生超時timeout-execution 線程創(chuàng)建一個相同配置的 Connection 對象用新創(chuàng)建的 Connection 發(fā)送取消查詢的命令圖4 MySQL 的 Statement 超時執(zhí)行過程
什么是 Socket 超時
類型4的 JDBC 驅(qū)動是用 socket 方式與數(shù)據(jù)庫連接的,應(yīng)用程序和數(shù)據(jù)庫之間的連接超時并不是由數(shù)據(jù)庫處理的。
當(dāng)數(shù)據(jù)庫突然宕掉或發(fā)生網(wǎng)絡(luò)錯誤(設(shè)備故障等)時,JDBC 驅(qū)動的 socket 超時的值是必須的。由于 TCP/IP 的結(jié)構(gòu),socket 沒有辦法檢測到網(wǎng)絡(luò)錯誤,因此應(yīng)用不能檢測到與數(shù)據(jù)庫到連接斷開了。如果沒有設(shè)置 socket 超時,應(yīng)用程序會一直等待數(shù)據(jù)庫返回結(jié)果。(這個連接也被叫做“死連接”) 為了避免死連接,socket 必須要設(shè)置超時時間。socket 超時可以通過 JDBC 驅(qū)動程序配置。通過設(shè)置 socket 超時,可以防止出現(xiàn)網(wǎng)絡(luò)錯誤時一直等待的情況并縮短故障時間。
不推薦使用 socket 超時來限制一個 statement 的執(zhí)行時間,因此socket 超時的值必須要高于 statement 的超時時間,否則 socket 超時將會先生效,這樣 statement 超時就沒有意義,也無法生效。
下面展示了 socket 超時設(shè)置的連個選項,其配置因不同的驅(qū)動而異。
socket 連接時的超時:通過 Socket 對象的 connect(SocketAddress endpoint, int timeout) 方法來配置socket 讀寫時的超時:通過 Socket 對象的 setSoTimeout(int timeout) 方法來配置下面列出了如何MySQL配置 socket 超時
連接超時配置: connectTimeout(默認(rèn)值:0,單位:毫秒)
socket 超時配置: socketTimeout(默認(rèn)值:0,單位:ms)
JDBC Url 格式:jdbc:mysql://[host:port],[host:port].../[database]
[?propertyName1][=propertyValue1][&propertyName2][=prop
connectTimeout 和 socketTimeout 的默認(rèn)值是 0 ,這意味著不會發(fā)生超時。
操作系統(tǒng)層面的 socket 超時配置
如果沒設(shè)置 socket 超時或連接超時,應(yīng)用程序多數(shù)情況下無法檢測到網(wǎng)絡(luò)錯誤。此時,應(yīng)用程序?qū)⒁恢钡却氯ィ钡竭B接上數(shù)據(jù)庫或能讀取到數(shù)據(jù)。然而,遇到的實際情況會發(fā)現(xiàn)問題常常在在應(yīng)用程序在30分鐘后嘗試重新連接到網(wǎng)絡(luò)后被解決了。這是因為操作系統(tǒng)也配置了 socket 超時時間。Linux 服務(wù)器將 socket 超時時間設(shè)置為30分鐘。它將在操作系統(tǒng)層面對網(wǎng)絡(luò)連接做校驗。
通常,應(yīng)用程序會在調(diào)用 socket 的 read() 方法時由于網(wǎng)絡(luò)問題而阻塞住。然而很少在調(diào)用 socket 的 write() 方法時處于等待狀態(tài),這取決于網(wǎng)絡(luò)構(gòu)成和錯誤類型。當(dāng)應(yīng)用程序調(diào)用 socket 的 write() 方法時,數(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ò)錯誤而滿了的話,socket.write() 也會進(jìn)入等待狀態(tài)。這種情況下,操作系統(tǒng)會嘗試重新發(fā)送數(shù)據(jù)包一段時間,并在達(dá)到超時限制時產(chǎn)生錯誤。
最后列出以下重點:
建議研發(fā)需要配置的超時包括:
sqlMap里的全局jdbcTimeout。視場景在sqlMap文件里單個語句中也可以設(shè)的jdbcTimeout,優(yōu)先級高于全局的。針對MySql驅(qū)動在jboss控制臺配置JDBC URL后面加connectTimeout,socketTimeout,但需要保證比Statemant級別的超時設(shè)置要長。數(shù)據(jù)庫層面的wait_timeout建議半小時容器里需要注意配取數(shù)據(jù)連接的驗證,如下圖:pos機連接超時怎么辦
通常是網(wǎng)絡(luò)信號的問題,一般出現(xiàn)這種情況就是機器里面的sim卡賣卜么有流量了,你可以嘗試換一張自己的卡,移動或者聯(lián)通,帶有GPRS流量的卡,爛配皮放進(jìn)去然后重啟一饑差下機器試試,如果還是不行清聯(lián)系服務(wù)商進(jìn)行更換專用SIM卡。不懂可以咨詢
簡述tcp擁塞避免算法的工作過程?
1、慢開始和擁塞避免
基于窗口的擁塞控制,在發(fā)送方維護一個擁塞窗口(cwnd),大小等于發(fā)送窗口,通過出現(xiàn)了超時來判斷網(wǎng)絡(luò)出現(xiàn)擁塞。慢開始的思路是一開始發(fā)送方發(fā)送一個字節(jié),在收到接收方的確認(rèn),然后發(fā)送的字節(jié)數(shù)量增大一倍(也就是按照指數(shù)增長的速率),從小到大逐步增大cwnd,直到cwnd 達(dá)到慢開始門限(ssthresh),停止慢開始算法,使用擁塞避免算法,擁塞避免算法思路是增長速率變?yōu)榫€性增長,也就是每經(jīng)過一個往返時間RTT就把發(fā)送方的cwnd加1,所以綜上:
當(dāng)cwnd < ssthresh ,使用慢開始算法;
當(dāng)cwnd = ssthresh,可以使用慢開始算法,也可以使用擁塞算法;
當(dāng)cwnd > ssthresh,使用擁塞算法;
2、快重傳和快恢復(fù)
通過上面兩個算法可以使得網(wǎng)絡(luò)傳輸速率一直增大,直到出現(xiàn)超時,這時候需要將cwnd重新調(diào)整到1個字節(jié)開始,使用慢開始算法,同時需要將慢開始門限ssthresh調(diào)整為cwnd(超時點)的一半,繼續(xù)執(zhí)行慢開始、擁塞避免算法。如果收到3-ACK(發(fā)送方一連接收到3個對同一個報文段的重復(fù)確認(rèn)),這種可能的情況是,并不是發(fā)生了擁塞,可能是報文丟失,所以發(fā)送方不執(zhí)行慢開始算法,直接使用快重傳算法,立即發(fā)送缺失的報文段。同時執(zhí)行快恢復(fù)算法,將門限值(ssthresh)調(diào)整為此時cwnd的一半,并執(zhí)行擁塞避免算法。
以上就是關(guān)于pos機器tcp超時,深入了解JDBC超時機制的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機器tcp超時的知識,希望能夠幫助到大家!
