郭興吉,李淑珍,文永革
(綿陽師范學院,綿陽 621000)
帶心跳功能的連接池技術(shù)研究
郭興吉,李淑珍,文永革
(綿陽師范學院,綿陽 621000)
在基于B/S或C/S架構(gòu)的多層應用系統(tǒng)設計中,往往存在大量的TCP/IP客戶連接和數(shù)據(jù)庫信息存取操作。決定系統(tǒng)性能優(yōu)劣的兩個重要因素,一是如何快速建立數(shù)據(jù)庫連接;二是如何避免出現(xiàn)死連接。在對數(shù)據(jù)庫連接池技術(shù)和死連接產(chǎn)生原因進行分析的基礎(chǔ)上,設計并實現(xiàn)帶心跳功能的連接池。
心跳包;數(shù)據(jù)庫;連接池
在當今互聯(lián)網(wǎng)時代,各行各業(yè)中凡涉及信息管理,無一例外都會利用計算機進行管理;為了提高信息的共享度和安全性,采用信息與系統(tǒng)程序分離存儲技術(shù),即信息存儲于遠程數(shù)據(jù)庫服務器,應用系統(tǒng)程序存儲于終端客戶計算機中。無論采用B/S還是C/S結(jié)構(gòu)的應用系統(tǒng)架構(gòu),由于信息安全,都會采用多層結(jié)構(gòu)體系(本文以最常用的三層結(jié)構(gòu)為例進行介紹)訪問數(shù)據(jù)庫中信息。Delphi作為一種成熟、開發(fā)效率高、使用廣泛的多平臺應用軟件開發(fā)工具,它以其面向?qū)ο?、安全性、平臺無關(guān)性、多線程和分布式等特性而著稱?;贒elphi的多層應用系統(tǒng),能快速處理各種復雜的數(shù)據(jù)維護操作、捕獲各種錯誤信息、高效響應眾多用戶的信息需求,等等。而決定應用系統(tǒng)響應效率的重要因素就是(不考慮硬件配置性能)數(shù)據(jù)庫的連接速度和與服務器之間的連接數(shù)。
當終端客戶需要使用數(shù)據(jù)庫服務器信息時,首先需要在客戶機與服務器之間建立網(wǎng)絡連接通道,在此基礎(chǔ)上,才能建立與數(shù)據(jù)庫之間的連接。在建立與數(shù)據(jù)庫之間的連接時,數(shù)據(jù)庫引擎需要為連接配置一系列系統(tǒng)資源,如內(nèi)存、數(shù)據(jù)庫對象、全域SQL空間等。當終端客戶用完數(shù)據(jù)庫信息而釋放數(shù)據(jù)庫連接時,數(shù)據(jù)庫引擎會關(guān)閉數(shù)據(jù)庫連接、釋放與之配套的系統(tǒng)資源;當終端客戶結(jié)束應用程序運行時,釋放網(wǎng)絡連接通道。顯然,最頻繁的是數(shù)據(jù)庫連接的建立與釋放。這樣一個建立和釋放過程,將消耗服務器較長的時間。如果有許多用戶不斷訪問數(shù)據(jù)庫,數(shù)據(jù)庫引擎將不斷重復這樣的資源分配和釋放,導致終端客戶連接數(shù)據(jù)庫的延遲,嚴重影響系統(tǒng)程序的執(zhí)行效率。另外,由于網(wǎng)絡通道不可預知的原因,例如,客戶端異常掉線或拔出網(wǎng)線、網(wǎng)絡通道出現(xiàn)故障等,將會在服務器上殘留一條TCP/IP死連接,如果客戶端用該連接通道連接有數(shù)據(jù)庫,與數(shù)據(jù)庫的連接也將成為死連接。如果大量客戶端并發(fā),可能產(chǎn)生的死TCP連接和數(shù)據(jù)庫連接過多,會消耗大量服務器內(nèi)存,導致服務器內(nèi)存耗盡而宕機。為了解決用戶需求響應效率,提高服務器的健壯性,帶心跳功能的數(shù)據(jù)庫連接池技術(shù)應運而生。
如圖1為典型的三層結(jié)構(gòu)模型。
從圖中可以看出,客戶端程序并不直接對數(shù)據(jù)庫進行操作,而是向中間層的應用服務器提交數(shù)據(jù)庫操作申請,由應用服務器中轉(zhuǎn),向目標數(shù)據(jù)庫服務器申請數(shù)據(jù),并將申請得到的數(shù)據(jù)集轉(zhuǎn)發(fā)給客戶端。其中,應用服務器可以與數(shù)據(jù)庫使用同一服務器,也可以分設;數(shù)據(jù)庫服務器可以只有一臺,也可以任意多臺。
從圖中還可以看出,一方面,當網(wǎng)絡連接通道出現(xiàn)異常時,在應用服務器上建立的TCP/IP連接就成為了一個死連接,客戶端利用該通道建立的數(shù)據(jù)庫連接也就成為了死連接。解決該問題的技術(shù)之一就是“心跳包”技術(shù)。另一方面,在應用服務器端,同時存在大量的數(shù)據(jù)庫連接,每一個數(shù)據(jù)庫連接都需要相應的數(shù)據(jù)庫組件、內(nèi)存等的支撐,這些組件的建立、管理與維護需要耗費服務器一定的時間開銷。如果存在大量的客戶端數(shù)據(jù)庫申請,服務器對數(shù)據(jù)庫組件、內(nèi)存的管理與維護所需時間開銷將直接導致客戶端響應效率的低下。解決該問題的技術(shù)之一就是“連接池”技術(shù)。因此,帶心跳功能的連接池技術(shù)解決的是在應用服務器上產(chǎn)生的TCP/IP、數(shù)據(jù)庫死連接和數(shù)據(jù)庫連接效率的問題。
圖1 典型的三層結(jié)構(gòu)模型
解決TCP/IP死連接最便捷的方法是直接采用TCP/IP協(xié)議中提供的心跳包技術(shù)。
(1)TCP keep-alive原理
一個TCP keep-alive包是一個簡單的ACK(Acknowledgement),該ACK包內(nèi)容為一個比當前連接序列號小于1的包。主機接收到這些ACKs會返回一個包含當前序列號的ACK包。
Keep-alives一般被用來驗證遠端連接是否有效。如果該連接沒有其他數(shù)據(jù)被傳輸,或者更高級別的keep-alives被傳送,keep-alives在每個KeepAliveTime被發(fā)送(默認是2個小時)。如果沒有收到keep-alive應答,keep-alive將在每間隔KeepAliveInterval秒重發(fā)一次(默認為1秒)。
(2)心跳包技術(shù)實現(xiàn)
根據(jù)TCP keep-alive原理,定義如下結(jié)構(gòu)的心跳包記錄:
在三層結(jié)構(gòu)應用服務器端的DSServer1組件,建立OnConnect事件:
該事件中,如果1分鐘內(nèi)該連接沒有與客戶端存在信息通信,則主動向客戶機發(fā)送一個keep-alive包,如果沒有收到客戶機應答的ACK包,則每間隔3秒發(fā)送一次,共發(fā)送5次,如果均未收到應答,則認為當前服務器與客戶機之間網(wǎng)絡通道出現(xiàn)故障,關(guān)閉當前TCP/IP連接,此時DSServer1組件將產(chǎn)生disconnect事件。
在該事件中,關(guān)閉連接池中與該連接端口有關(guān)的全部數(shù)據(jù)庫連接。否則,雖然解決了網(wǎng)絡TCP/IP的死連接,但仍然存在數(shù)據(jù)庫死連接的現(xiàn)象(特別地,如果需要統(tǒng)計客戶端利用該端口的網(wǎng)絡連接數(shù),可以在connect和disconnect事件中實現(xiàn))。
(1)連接池原理
數(shù)據(jù)庫連接池就是把由應用服務器建立的一定數(shù)量的連接對象放到一個緩沖池中,等待其他對象調(diào)用。數(shù)據(jù)庫連接池技術(shù)的原理是:當有終端客戶應用程序申請進行數(shù)據(jù)庫連接時,首先從緩沖池中查詢是否有空閑連接對象,如果有則連接供客戶使用;如果沒有,則客戶應用程序等待,直至有客戶使用完并歸還連接對象后再使用??蛻魬贸绦蛟谑褂猛赀B接對象并歸還給連接池時,不釋放系統(tǒng)資源,只標識連接對象為“空閑”狀態(tài),取消連接對象相關(guān)屬性設置。
(2)連接池類型定義
根據(jù)數(shù)據(jù)庫連接池的工作原理,連接池類型定義為一個記錄類型:
其中,元素name用于標識連接名稱,作為客戶使用結(jié)束數(shù)據(jù)庫連接后歸還連接的依據(jù);qry用于連接數(shù)據(jù)表;prov用于數(shù)據(jù)集接口;mport用于記錄與客戶端連接使用的端口號;state用于標識該連接是否空閑。
(3)連接池定義
連接池規(guī)模,是指可同時接受客戶端連接數(shù)據(jù)庫的個數(shù)。其大小應依據(jù)服務器性能、所承擔的客戶申請數(shù)據(jù)庫的數(shù)量等因素確定。如果客戶可能頻繁訪問數(shù)據(jù)庫,則要求服務器性能較優(yōu),連接池數(shù)量建議定得較大(上萬數(shù)量級);相反可定義連接池上千數(shù)量級。
在Delphi中,在全局變量區(qū)定義連接池的大小,如:
其中,g_MaxPoolSize是由const定義的常量,值由上述原則確定。
(4)連接池的使用
①連接池的申請
當客戶申請數(shù)據(jù)庫連接時,首先查找連接池中的空閑連接,如果存在則進一步查看該連接的數(shù)據(jù)庫組件和數(shù)據(jù)集組件是否建立,如果已建立則分配使用,同時標注連接端口號和連接狀態(tài);如果未建立,則創(chuàng)建數(shù)據(jù)庫組件和數(shù)據(jù)集組件,標注連接端口號和連接狀態(tài)。向客戶返回連接名稱;如果不存在空閑,則向客戶返回一個nil。
②歸還數(shù)據(jù)連接組件到連接池
當客戶使用結(jié)束數(shù)據(jù)表時,需要歸還數(shù)據(jù)連接組件到連接池。此時,關(guān)閉與數(shù)據(jù)表的連接,同時設置對應連接的端口號為0,連接狀態(tài)為false。
帶心跳功能的連接池技術(shù),已經(jīng)多年實際使用證明該技術(shù)具有高可靠性、高穩(wěn)定性和高運行效率的特點。結(jié)合客戶端心跳包思想的應用,還可以解決兩層結(jié)構(gòu)的數(shù)據(jù)庫死連接問題。
[1] 胡志坤,何多昌,桂衛(wèi)華,陽春華.基于改進心跳包機制的整流遠程監(jiān)控系統(tǒng)[J].計算機應用,2008(02)
[2] 周鳳石.基于Windows Socket的網(wǎng)絡通信中的心跳機制原理及其實現(xiàn)[J].沙洲職業(yè)工學院學報,2009(03)
[3] 侯宗浩,董小社,鄭守淇,劉愛華,胡雷鈞.一種支持負載均衡的多機心跳模型[J].小型微型計算機系統(tǒng),2005(01)
[4] 康明光,廖勝利,程春田,馬慧芳,蔡華祥.管家式自適應數(shù)據(jù)庫連接池及其應用[J].南方電網(wǎng)技術(shù),2012(01)
[5] 楊長春.數(shù)據(jù)庫連接池技術(shù)的分析與研究[J].硅谷,2008(13)
Research on the Connection Pool Technology with Heartbeat Function
GUO Xing-ji,LI Shu-zhen,WEN Yong-ge
(Mianyang Normal University,Mianyang 621000)
A large number of TCP/IP client connections and access operations of database information often exist in the design of multi-application system based on B/S or C/S architecture.The two most important factors that determine the system performance is how to establish the database connection rapidly,and the other one is how to avoid the appearance of dead joints.Designs and realizes a connection pool with heartbeat function,according to the analysis of the connection pool technology and the cause of the dead joints.
Heartbeat;Database;Connection Pool
1007-1423(2015)03-0065-05
10.3969/j.issn.1007-1423.2015.03.018
郭興吉,男,四川南充人,大專,教授,研究方向為模式識別、算法設計與分析
2014-12-09
2014-12-29
李淑珍,女,四川南充人,本科,助理研究員,研究方向為檔案存儲的算法設計與分析
文永革,男,四川遂寧人,碩士研究生,副教授,研究方向為虛擬現(xiàn)實、算法設計與分析