- 相關(guān)推薦
分布式網(wǎng)絡(luò)系統(tǒng)中的數(shù)據(jù)訪問設(shè)計與優(yōu)化
分布式網(wǎng)絡(luò)系統(tǒng)中的數(shù)據(jù)訪問設(shè)計與優(yōu)化*
張均東,任 光,陳 健
(大連海事大學(xué) 輪機(jī)工程學(xué)院,遼寧大連 116026)
摘 要:
在基于局域網(wǎng)的大型分布式仿真和控制系統(tǒng)中,包括數(shù)據(jù)庫服務(wù)器在內(nèi)的各計算機(jī)之間的信息交互方案的設(shè)計是系統(tǒng)性能優(yōu)異的關(guān)鍵,尤其是在計算機(jī)數(shù)量較多或待交互的單位時間信息量較大時更為重要。計算機(jī)間的信息交互涉及各機(jī)間的共享數(shù)據(jù)的讀取、存貯和更新等方面的內(nèi)容,需采取有效的系統(tǒng)規(guī)劃、實時通訊和快速數(shù)據(jù)庫訪問等手段解決。本文全面論述了有關(guān)內(nèi)容,給出了有效的解決方案。
關(guān)鍵詞:網(wǎng)絡(luò)系統(tǒng)、 信息交互、優(yōu)化設(shè)計
1 前言
隨著計算機(jī)和網(wǎng)絡(luò)技術(shù)的不斷提高,使用基于局域網(wǎng)的,分布式的計算機(jī)系統(tǒng)對大型、綜合或復(fù)雜的工業(yè)過程和運(yùn)行環(huán)境進(jìn)行系統(tǒng)仿真與運(yùn)行模擬以及控制已越來越普遍。由于這樣的仿真與控制系統(tǒng)一般規(guī)模龐大或過程復(fù)雜,單獨一臺計算機(jī)無法完成整個系統(tǒng)任務(wù),需要多機(jī)參與,構(gòu)成計算機(jī)網(wǎng)絡(luò),通過網(wǎng)上信息交互共同協(xié)調(diào)完成整個仿真與控制任務(wù)。各機(jī)之間信息交互的方式、頻率和數(shù)量決定了整個網(wǎng)絡(luò)系統(tǒng)的綜合性能。由于在這樣的系統(tǒng)中,機(jī)間的信息交互一般都非常頻繁,各機(jī)都要面臨數(shù)據(jù)更新、系統(tǒng)運(yùn)行、結(jié)果存貯等過程的快速性問題,因此有關(guān)的設(shè)計是非常重要和關(guān)鍵的。
2 系統(tǒng)規(guī)劃與設(shè)計
無論是仿真還是控制系統(tǒng),合理的系統(tǒng)和數(shù)據(jù)規(guī)劃至關(guān)重要。通過系統(tǒng)和數(shù)據(jù)規(guī)劃可以優(yōu)化系統(tǒng)設(shè)計,解決各機(jī)任務(wù)均衡,資源充分利用等問題,在兼顧可靠性、安全性和故障可診斷性的同時充分發(fā)揮系統(tǒng)的整體效率和性能,并容許具有一定的可擴(kuò)展性。
目前有許多分布式仿真和控制系統(tǒng)采用以數(shù)據(jù)庫為中心的設(shè)計方案。在這種設(shè)計方案中,網(wǎng)上的交互信息通過數(shù)據(jù)庫來進(jìn)行,首先由產(chǎn)生交互信息的機(jī)器存入數(shù)據(jù)庫,然后由需要該交互信息的機(jī)器從數(shù)據(jù)庫中讀出來完成一個信息交互或更新過程。由于該信息交互通過一個中間環(huán)節(jié)即數(shù)據(jù)庫來進(jìn)行,因此在網(wǎng)上的計算機(jī)數(shù)量較多或程序要求的數(shù)據(jù)更新較多較快時,易造成數(shù)據(jù)沖突和網(wǎng)絡(luò)堵塞,極易導(dǎo)致系統(tǒng)運(yùn)行遲緩或死機(jī),成為整個系統(tǒng)性能的瓶頸。
當(dāng)然以數(shù)據(jù)庫為中心的分布式仿真和控制系統(tǒng)也有其優(yōu)點,其編程思路比較簡單清晰,容易被人理解和掌握。對于網(wǎng)上信息交互量不多的系統(tǒng),可以采用以數(shù)據(jù)庫為中心的系統(tǒng),同時可以通過數(shù)據(jù)規(guī)劃合理地分配各計算機(jī)的任務(wù),使用一些編程技術(shù)來降低網(wǎng)上的信息流量,提高系統(tǒng)的性能。例如在程序中應(yīng)盡量使用全局變量創(chuàng)建公用數(shù)據(jù)庫連接,避免每次不必要的數(shù)據(jù)連接重建時間。
如果系統(tǒng)較大、網(wǎng)上信息交互量較多或?qū)ο到y(tǒng)實時性和可擴(kuò)展性要求較高時,應(yīng)采用實時網(wǎng)絡(luò)數(shù)據(jù)通訊的設(shè)計方案。在以數(shù)據(jù)庫為中心的系統(tǒng)設(shè)計方案中,由于數(shù)據(jù)的變化首先要存入數(shù)據(jù)庫,然后被其它程序訪問才能刷新,經(jīng)歷了數(shù)據(jù)庫存取這一中間環(huán)節(jié)。如果網(wǎng)上有多個應(yīng)用程序都需要知道該數(shù)據(jù)的變化,則都必須通過數(shù)據(jù)庫訪問才能更新。這樣就浪費(fèi)了許多網(wǎng)絡(luò)資源,容量造成瓶頸。在采用實時網(wǎng)絡(luò)數(shù)據(jù)通訊的設(shè)計方案中,通過網(wǎng)絡(luò)實時通訊來解決網(wǎng)上各機(jī)器間的數(shù)據(jù)交互與刷新問題,其中對于多臺機(jī)器都需要的數(shù)據(jù)變化通過網(wǎng)絡(luò)廣播的方式,以定時和數(shù)據(jù)變化實時觸發(fā)傳送的機(jī)制向所需機(jī)器通知該數(shù)據(jù)已發(fā)生變化和具體的數(shù)值;對于只存在兩臺機(jī)器之間的信息交互可采用點對點的方式進(jìn)行通訊。通訊的數(shù)據(jù)格式和組織可以自行定義。因此,與以數(shù)據(jù)庫為中心的方案相比,該設(shè)計方案減少了因數(shù)據(jù)刷新所需的多次訪問問題,大大減少了數(shù)據(jù)流量,同時網(wǎng)絡(luò)傳輸還可以增加數(shù)據(jù)正確性和合法性校驗,為操作者或系統(tǒng)管理員及時提供系統(tǒng)信息和出錯信息,便于系統(tǒng)故障診斷和系統(tǒng)調(diào)試。
如果把各子系統(tǒng)初始化數(shù)據(jù)都保存在服務(wù)器的數(shù)據(jù)庫中,則各機(jī)一起啟動時,由于都需要建立數(shù)據(jù)庫鏈接,讀取其中的初始化數(shù)據(jù),容易造成起動時間過長的現(xiàn)象。為此,對于不必要存于服務(wù)器的數(shù)據(jù)可存于本地數(shù)據(jù)庫中,本地數(shù)據(jù)庫可采用ACCESS數(shù)據(jù)庫。對于一般不變的系統(tǒng)初始化數(shù)據(jù)也可以備存到本地數(shù)據(jù)庫中,供日常程序起動時使用。如果系統(tǒng)的初始化數(shù)據(jù)進(jìn)行了更新,可以編制一段程序,根據(jù)數(shù)據(jù)庫服務(wù)器的數(shù)據(jù)庫版本號來更新本地數(shù)據(jù)庫。無論何種方案,數(shù)據(jù)庫的訪問總是不能避免的,如何提高數(shù)據(jù)庫的訪問速度非常值得研究。
3 提高數(shù)據(jù)庫訪問速度(以SQL數(shù)據(jù)庫為例)
客戶機(jī)程序一般采用VC++,VB
,PowerBuilder,Delphi等支持訪問數(shù)據(jù)庫的集成開發(fā)環(huán)境進(jìn)行開發(fā)。在編寫客戶端程序時,一般通過ODBC(Open Database Connectibvity) API,RDO(Remote Data Objects) [5],ADO(ActiveX Data Objects) [5]訪問數(shù)據(jù)庫,查詢或修改數(shù)據(jù)庫中的數(shù)據(jù)。其中ODBC API是被人們廣泛接受的用于數(shù)據(jù)庫訪問的應(yīng)用程序編程接口。具有訪問數(shù)據(jù)庫速度快效率高,但編程復(fù)雜的特點;遠(yuǎn)程數(shù)據(jù)對象(RDO)對ODBC API函數(shù)進(jìn)行了封裝,為編程人員提供了一個訪問遠(yuǎn)程數(shù)據(jù)庫的高級接口,在程序中通過該對象可輕松對數(shù)據(jù)庫進(jìn)行遠(yuǎn)程訪問。組件對象(ADO)不僅繼承而且發(fā)展了RDO,它不但具有訪問遠(yuǎn)程數(shù)據(jù)庫的能力,而且還具有訪問其它數(shù)據(jù)提供者(不一定是數(shù)據(jù)庫,可能是其他文件或其他應(yīng)用程序所提供的數(shù)據(jù))的能力。在VB中可很方便的使用RDO和
ADO來訪問數(shù)據(jù)庫,但訪問數(shù)據(jù)庫效率不高,速度較慢,靈活性也差。為了滿足系統(tǒng)的要求經(jīng)常需要提高訪問數(shù)據(jù)庫的速度,具體方法有:
3.1 使用ODBC API函數(shù)
由于ODBC API函數(shù)的入口參數(shù)表中有些參數(shù)需要傳遞指針,而VB不支持指針,因此在VB中調(diào)用ODBC API函數(shù)會有一定的限制。另外,VB的字符串內(nèi)存存儲格式與C語言不同,而ODBC API函數(shù)是用C語言開發(fā)的,這也限制了VB和ODBC API
函數(shù)之間的數(shù)據(jù)交換。為此需要開發(fā)一個動態(tài)鏈接庫(Dynamic Link Library - DLL),編制二個API函數(shù)分別以獲取參數(shù)指針和支持?jǐn)?shù)據(jù)交換,從而實現(xiàn)在該動態(tài)鏈接庫的支持下,在VB中直接調(diào)用ODBC API函數(shù)的目的。
可以使用VC++6.0開發(fā)動態(tài)鏈接庫。VC++6.0可開發(fā)三種類型的動態(tài)鏈接庫:Win32 DLL、常規(guī) MFC DLL、擴(kuò)展 MFC DLL。其中Win32 DLL、常規(guī) MFC DLL可被任意Win32編程環(huán)境(包括Visual Basic 6.0
版)加載使用。常規(guī) MFC DLL在發(fā)行時必須附帶MFC42.DLL庫,而Win32 DLL可單獨發(fā)行[3]。如果只提供給VB編程環(huán)境使用,可建立Win32 DLL即可。
具體的開發(fā)步驟為:利用VC++6.0編程環(huán)境的AppWizard創(chuàng)建一個簡單Win32 DLL工程,工程名為SQLAPI,在此基礎(chǔ)上加入自己的代碼。代碼如下:
#include "stdafx.h"
#define DLLEXPORT
extern "C" __declspec( dllexport) //定義導(dǎo)出宏
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{ return TRUE; }
DLLEXPORT long __stdcall GetAddress(void * Address) //按地址傳送
{ return (long) Address; }//將地址強(qiáng)制轉(zhuǎn)換為長整形
DLLEXPORT long __stdcall strCopyToByte (char * BytesAddress,char * strAddress)
{ return (long) strcpy(BytesAddress, strAddress); }//
將字符串傳送到指定地址
經(jīng)編譯鏈接生成SQLAPI.DLL動態(tài)鏈接庫,將其拷貝到C:\WINDOWS\SYSTEM(對于Windows) 或C:\WINNT\SYSTEM32(對于Windows NT 或2000)目錄下,這樣就可在VB中調(diào)用這兩個API函數(shù)實現(xiàn)對ODBC API的調(diào)用。ODBC調(diào)用的一般流程為:
1連接至數(shù)據(jù)源:分配環(huán)境句柄、設(shè)置環(huán)境屬性、分配聯(lián)接句柄、聯(lián)接數(shù)據(jù)源和設(shè)置聯(lián)接屬性。
2初始化應(yīng)用程序:分配語句句柄、設(shè)置語句屬性,必要時進(jìn)行數(shù)據(jù)綁定。
3建立和執(zhí)行SQL語句:a) 建立SQL語句,或使用硬編碼的SQL語句。b) 如果SQL語句含有參數(shù),將每個參數(shù)綁定至應(yīng)用程序變量。c) 用SQLExecDirect執(zhí)行該語句。如果語句要多次執(zhí)行,則進(jìn)行語句準(zhǔn)備,并用SQLExecute來執(zhí)行。
使用API函數(shù)可以加快數(shù)據(jù)庫的訪問,提高效率,另外也要注意SQL語句的語法優(yōu)化。對于巨表和多表訪問,SQL
【分布式網(wǎng)絡(luò)系統(tǒng)中的數(shù)據(jù)訪問設(shè)計與優(yōu)化】相關(guān)文章:
生活中的數(shù)據(jù)教學(xué)設(shè)計08-16
GIS訪問網(wǎng)絡(luò)數(shù)據(jù)庫中若干技術(shù)問題的探討08-06
ASP技術(shù)訪問WEB數(shù)據(jù)庫08-06
ASP技術(shù)訪問WEB數(shù)據(jù)庫08-06
ASP技術(shù)訪問WEB數(shù)據(jù)庫 208-06