郭興吉,李淑珍,文永革
(綿陽師范學院,綿陽 621000)
帶心跳功能的連接池技術研究
郭興吉,李淑珍,文永革
(綿陽師范學院,綿陽 621000)
在基于B/S或C/S架構的多層應用系統設計中,往往存在大量的TCP/IP客戶連接和數據庫信息存取操作。決定系統性能優劣的兩個重要因素,一是如何快速建立數據庫連接;二是如何避免出現死連接。在對數據庫連接池技術和死連接產生原因進行分析的基礎上,設計并實現帶心跳功能的連接池。
心跳包;數據庫;連接池
在當今互聯網時代,各行各業中凡涉及信息管理,無一例外都會利用計算機進行管理;為了提高信息的共享度和安全性,采用信息與系統程序分離存儲技術,即信息存儲于遠程數據庫服務器,應用系統程序存儲于終端客戶計算機中。無論采用B/S還是C/S結構的應用系統架構,由于信息安全,都會采用多層結構體系(本文以最常用的三層結構為例進行介紹)訪問數據庫中信息。Delphi作為一種成熟、開發效率高、使用廣泛的多平臺應用軟件開發工具,它以其面向對象、安全性、平臺無關性、多線程和分布式等特性而著稱。基于Delphi的多層應用系統,能快速處理各種復雜的數據維護操作、捕獲各種錯誤信息、高效響應眾多用戶的信息需求,等等。而決定應用系統響應效率的重要因素就是(不考慮硬件配置性能)數據庫的連接速度和與服務器之間的連接數。
當終端客戶需要使用數據庫服務器信息時,首先需要在客戶機與服務器之間建立網絡連接通道,在此基礎上,才能建立與數據庫之間的連接。在建立與數據庫之間的連接時,數據庫引擎需要為連接配置一系列系統資源,如內存、數據庫對象、全域SQL空間等。當終端客戶用完數據庫信息而釋放數據庫連接時,數據庫引擎會關閉數據庫連接、釋放與之配套的系統資源;當終端客戶結束應用程序運行時,釋放網絡連接通道。顯然,最頻繁的是數據庫連接的建立與釋放。這樣一個建立和釋放過程,將消耗服務器較長的時間。如果有許多用戶不斷訪問數據庫,數據庫引擎將不斷重復這樣的資源分配和釋放,導致終端客戶連接數據庫的延遲,嚴重影響系統程序的執行效率。另外,由于網絡通道不可預知的原因,例如,客戶端異常掉線或拔出網線、網絡通道出現故障等,將會在服務器上殘留一條TCP/IP死連接,如果客戶端用該連接通道連接有數據庫,與數據庫的連接也將成為死連接。如果大量客戶端并發,可能產生的死TCP連接和數據庫連接過多,會消耗大量服務器內存,導致服務器內存耗盡而宕機。為了解決用戶需求響應效率,提高服務器的健壯性,帶心跳功能的數據庫連接池技術應運而生。
如圖1為典型的三層結構模型。
從圖中可以看出,客戶端程序并不直接對數據庫進行操作,而是向中間層的應用服務器提交數據庫操作申請,由應用服務器中轉,向目標數據庫服務器申請數據,并將申請得到的數據集轉發給客戶端。其中,應用服務器可以與數據庫使用同一服務器,也可以分設;數據庫服務器可以只有一臺,也可以任意多臺。
從圖中還可以看出,一方面,當網絡連接通道出現異常時,在應用服務器上建立的TCP/IP連接就成為了一個死連接,客戶端利用該通道建立的數據庫連接也就成為了死連接。解決該問題的技術之一就是“心跳包”技術。另一方面,在應用服務器端,同時存在大量的數據庫連接,每一個數據庫連接都需要相應的數據庫組件、內存等的支撐,這些組件的建立、管理與維護需要耗費服務器一定的時間開銷。如果存在大量的客戶端數據庫申請,服務器對數據庫組件、內存的管理與維護所需時間開銷將直接導致客戶端響應效率的低下。解決該問題的技術之一就是“連接池”技術。因此,帶心跳功能的連接池技術解決的是在應用服務器上產生的TCP/IP、數據庫死連接和數據庫連接效率的問題。

圖1 典型的三層結構模型
解決TCP/IP死連接最便捷的方法是直接采用TCP/IP協議中提供的心跳包技術。
(1)TCP keep-alive原理
一個TCP keep-alive包是一個簡單的ACK(Acknowledgement),該ACK包內容為一個比當前連接序列號小于1的包。主機接收到這些ACKs會返回一個包含當前序列號的ACK包。
Keep-alives一般被用來驗證遠端連接是否有效。如果該連接沒有其他數據被傳輸,或者更高級別的keep-alives被傳送,keep-alives在每個KeepAliveTime被發送(默認是2個小時)。如果沒有收到keep-alive應答,keep-alive將在每間隔KeepAliveInterval秒重發一次(默認為1秒)。
(2)心跳包技術實現
根據TCP keep-alive原理,定義如下結構的心跳包記錄:


在三層結構應用服務器端的DSServer1組件,建立OnConnect事件:

該事件中,如果1分鐘內該連接沒有與客戶端存在信息通信,則主動向客戶機發送一個keep-alive包,如果沒有收到客戶機應答的ACK包,則每間隔3秒發送一次,共發送5次,如果均未收到應答,則認為當前服務器與客戶機之間網絡通道出現故障,關閉當前TCP/IP連接,此時DSServer1組件將產生disconnect事件。


在該事件中,關閉連接池中與該連接端口有關的全部數據庫連接。否則,雖然解決了網絡TCP/IP的死連接,但仍然存在數據庫死連接的現象(特別地,如果需要統計客戶端利用該端口的網絡連接數,可以在connect和disconnect事件中實現)。
(1)連接池原理
數據庫連接池就是把由應用服務器建立的一定數量的連接對象放到一個緩沖池中,等待其他對象調用。數據庫連接池技術的原理是:當有終端客戶應用程序申請進行數據庫連接時,首先從緩沖池中查詢是否有空閑連接對象,如果有則連接供客戶使用;如果沒有,則客戶應用程序等待,直至有客戶使用完并歸還連接對象后再使用??蛻魬贸绦蛟谑褂猛赀B接對象并歸還給連接池時,不釋放系統資源,只標識連接對象為“空閑”狀態,取消連接對象相關屬性設置。
(2)連接池類型定義
根據數據庫連接池的工作原理,連接池類型定義為一個記錄類型:

其中,元素name用于標識連接名稱,作為客戶使用結束數據庫連接后歸還連接的依據;qry用于連接數據表;prov用于數據集接口;mport用于記錄與客戶端連接使用的端口號;state用于標識該連接是否空閑。
(3)連接池定義
連接池規模,是指可同時接受客戶端連接數據庫的個數。其大小應依據服務器性能、所承擔的客戶申請數據庫的數量等因素確定。如果客戶可能頻繁訪問數據庫,則要求服務器性能較優,連接池數量建議定得較大(上萬數量級);相反可定義連接池上千數量級。
在Delphi中,在全局變量區定義連接池的大小,如:

其中,g_MaxPoolSize是由const定義的常量,值由上述原則確定。
(4)連接池的使用
①連接池的申請
當客戶申請數據庫連接時,首先查找連接池中的空閑連接,如果存在則進一步查看該連接的數據庫組件和數據集組件是否建立,如果已建立則分配使用,同時標注連接端口號和連接狀態;如果未建立,則創建數據庫組件和數據集組件,標注連接端口號和連接狀態。向客戶返回連接名稱;如果不存在空閑,則向客戶返回一個nil。



②歸還數據連接組件到連接池
當客戶使用結束數據表時,需要歸還數據連接組件到連接池。此時,關閉與數據表的連接,同時設置對應連接的端口號為0,連接狀態為false。

帶心跳功能的連接池技術,已經多年實際使用證明該技術具有高可靠性、高穩定性和高運行效率的特點。結合客戶端心跳包思想的應用,還可以解決兩層結構的數據庫死連接問題。
[1] 胡志坤,何多昌,桂衛華,陽春華.基于改進心跳包機制的整流遠程監控系統[J].計算機應用,2008(02)
[2] 周鳳石.基于Windows Socket的網絡通信中的心跳機制原理及其實現[J].沙洲職業工學院學報,2009(03)
[3] 侯宗浩,董小社,鄭守淇,劉愛華,胡雷鈞.一種支持負載均衡的多機心跳模型[J].小型微型計算機系統,2005(01)
[4] 康明光,廖勝利,程春田,馬慧芳,蔡華祥.管家式自適應數據庫連接池及其應用[J].南方電網技術,2012(01)
[5] 楊長春.數據庫連接池技術的分析與研究[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
李淑珍,女,四川南充人,本科,助理研究員,研究方向為檔案存儲的算法設計與分析
文永革,男,四川遂寧人,碩士研究生,副教授,研究方向為虛擬現實、算法設計與分析