快速資料庫存取

快速資料庫存取(fast database access)是指採用各種技術和設定參數來對資料庫進行快速的數據存取,以此提高資料庫的實時性和數據載入效率的操作。在實時性強且數據量大的實際問題中,是成功的套用資料庫技術的關鍵。

基本介紹

  • 中文名:快速資料庫存取
  • 外文名:fast database access
  • 套用領域:資料庫等
  • 涉及學科:信息科學
  • 關鍵:磁碟檔案的快速讀寫
  • 套用:電網調度系統等
背景,記錄快速訪問,套用與優點,技術介紹,共享記憶體,

背景

在實時性強且數據量大的實際問題中,成功的套用資料庫技術的關鍵是有效地提高記錄存取速度。傳統的大型商用資料庫系統因在速度上的缺陷,難以在實時問題中充分發揮作用。從套用角度看,通過有效的數據組織及合理的資料庫操作可在一定程度上提高速度。然而直接由資料庫管理系統提供快速的記錄存取則是解決問題的根本方法。
資料庫快速存取的關鍵在於磁碟檔案的快速讀寫。實際性能測試及套用表明:通過大緩衝區進行CPU和磁碟I/O的異步並行操作可使資料庫記錄存取速度得到實質性提高,從而滿足實時問題的要求。該方法已成功地套用於多個電網調度系統中。

記錄快速訪問

記錄快速訪問基於高效的緩衝區數據管理。記憶體緩衝區受實際限制不能無限擴大。利用磁碟數據的異步讀寫則可明顯改善這種限制引起的讀寫效率障礙。
緩衝區長度及個數的確定
設單個記錄長度不大於緩衝區長度。記錄與緩衝區的關係有三種:
a.記錄完全在緩衝區
b.記錄部分在緩衝區,其餘在磁碟
c.記錄全部在磁碟
若滿足情況a,則不必訪盤即可對該記錄訪問;對於情況b和情況。則仍需一次訪盤操作。這意味著增加緩衝區長度可在一定程度上減少訪盤次數。但緩衝區太大會產生一系列副作用,影響整體效率。實際測試表明:適宜的緩衝區長度應是磁碟一個磁軌的數據長度,若同時將檔案頭定位於某一磁軌的起始位置,則可有效地減少磁碟定位時間,加快記錄訪問。
在將磁碟數據讀入緩衝區的同時,CPU進行其他數據處理稱為異步讀;同樣在緩衝區數據寫入磁碟的同時,CPU進行其他操作稱為異步寫。異步讀寫實際是CPU與I/O處理機的異步並行操作,利用異步讀寫可以完全解決情況b並部分解決情況。所遇到的問題,但需多緩衝區支持。首先利用兩個以上緩衝區進行單純的異步讀或異步寫並不比只用兩個緩衝區效率高;另外若讀和寫共用兩個緩衝區則導致緩衝區數據的大量交替讀寫,使記錄訪問速度明顯降低。因此在RTDBMS中對每個打開檔案設定四個緩衝區:
  • rbf[0]:讀緩衝區I;
  • rbf[1]:讀緩衝區Ⅱ;
  • wbf[0]:寫緩衝區I;
  • wbf[1]:寫緩衝區Ⅱ;
其中將CPU正在使用的緩衝區稱為當前緩衝區;另外一個稱為備用緩衝區。
基本異步讀寫可歸結為下列三個C函式:
  • a. aioread(f,position,length , rbuffer).
  • b. aiowrite(f,position,length,wbuffer).
  • c. aiowait (f ).
其中aioread()由CPU初始化一個讀任務,從檔案f的position位置讀長度為length的數據注入緩衝區rbuffer中,不等該任務完成便將CPU控制權返回原程式。aiowrite()則由CPU初始化一個寫任務,將wbuffer中數據寫入檔案f,其他參數與aioread()同。aiowait()強制CPU等待,直到對檔案f的異步I/O完成,若檔案沒有異步操作則立即返回。
寫算法
設寫緩衝區wbf[0], wbf[1〕為檔案f寫操作專用。設定如下參數以標誌寫緩衝區狀態:
  • wbfl:寫緩衝區長度。
  • wbfs; (=0,1)緩衝區標誌。wbf[wbfs]為當前緩衝區;wbf [wbfs]ˉ為備用緩衝區。
  • wbfp:當前緩衝區檔案指針,即緩衝區內容在f中對應起始位置。
  • wbfd:當前緩衝區數據實際長度,wbfd≤wbfl 。
將用戶緩衝區ubf中長度為L的數據寫入檔案f的offset位置的緩衝區處理算法如下:
1)若當‘前緩衝區空(wbfd=0),則置wbfp=offset,轉40
2)若wbfp鎮offset毛wbfp-f-wbfd,轉40
3)當前緩衝區數據寫盤並修改參數:
性能分析
由寫算法知:將一個或多個連續記錄寫入檔案f,只需根據記錄長度計算數據起始位置offset和數據長度L便可利用寫算法完成寫入。一般只是將用戶數據移入當前寫緩衝區而無需訪盤操作。當寫緩衝區填滿或寫入數據不連續時,進行當前與備用緩衝區轉換處理。耗費的寫盤時間只是提交一個寫盤任務的時間,而備用緩衝區數據的寫盤操作則是在處理當前數據的同時進行的。
利用讀算法進行資料庫記錄讀出,若記錄在當前緩衝區則不占訪盤時間;若記錄跨越當前緩衝區或在備用緩衝區,則需占用緩衝區轉換時間;若記錄既不在當前緩衝區,也不在備用緩衝區,則必需占用實際訪盤時間。
讀寫算法加快記錄存取的關鍵是在大緩衝區支持的基礎上充分利用磁碟I/O與CPU數據處理的並行性。與單純採用大緩衝區實現的快速記錄存取比較,具有明顯的高速度。
下面以Oracle專用資料庫的訪問技術為例,對快速資料庫存取方式和設計進行進一步說明。

套用與優點

Oracle資料庫的快速載入方法
隨著Windows系列作業系統的廣泛使用,採用Visual C++語言來開發客戶端程式的用戶越來越多。在用於伺服器端的資料庫軟體方面,Oracle以其支持大型資料庫、多用戶的高性能事務處理,對業界各項工業標準的支持,對Internet三層結構的支持,完整的安全性控制,支持分散式資料庫和分布處理,具有可移植性、可兼容性和可連線性等突出優點倍受用戶喜愛。目前,VC++和Oracle資料庫連線的方法很多。因此,根據不同實際需要,採用何種方式來開發基於Oracle資料庫的VC++應用程式,成為系統設計的一項重要技術問題,是保證系統開發在時間周期、系統性能諸方面達到設計要求的關鍵。
選出OCL技術用於離線Oracle資料庫的開發。OCL直接路徑載入方法能夠把大批量的仿真結果快速地存入離線資料庫,從而較大程度地提高了DTS系統整體的實時性。通過分析OCL的數據載入機理,在編程方面對OCL技術進行改進,避免了仿真結果載入之前頻繁的連線離線資料庫中的表格,數據載入效率顯著提高。實驗結果證明,OCL技術在數據的讀寫方面具有明顯的速度優勢,能夠滿足DTS對數據快速存取的要求。

技術介紹

下面介紹幾種Oracle資料庫的訪問技術,並對它們進行了對比,從中選出效率最高、數據接口速度最快的方法,開發DTS的離線Oracle資料庫。
通用資料庫訪問技術
ODBC
ODBC是Open Database Connectivity即開放資料庫互連的簡稱,它是Microsoft公司於1991年提出的一個用於訪問資料庫的統一標準,是應用程式和資料庫系統之間的中間件。它通過使用相應套用平台和所需資料庫對應的驅動程式與應用程式的互動來實現對資料庫的操作,避免了在應用程式中直接調用與資料庫相關的操作,從而保證了資料庫的獨立性。ODBC主要由應用程式,驅動程式管理器,驅動程式和數據源四個部分組成,如圖所示。
快速資料庫存取
ODBC實現的套用,其實質是通過建立相應資料庫數據源的方式進行。通過建立不同的數據源,ODBC可以使同一個軟體應用程式無差別地訪問各種不同資料庫,直接存取各種類型的數據。由此可見,ODBC在套用環境下為資料庫套用提供對異種資料庫資源的透明訪問能力。這意味著,用戶可以把對各種完全不同的資料庫訪問,看作是對一種資料庫的訪問,而不必關心資料庫的類型、地址、結構以及其它資料庫間的關係等細節;對開發者來說,可以將資料庫訪問例程引入各種套用軟體中,而無需了解資料庫在結構以及網路連線的細節等等。因此,在目前流行的資料庫系統兩大開發模式C/S, B/S體系結構中,ODBC得到廣泛的套用。
ADO
ActiveX數據對象(ActiveX Data Objects ADO)是OLEDB與應用程式之間的橋樑。OLEDB提供了為最佳化各種應用程式而設計的編程接口,但是不能滿足所有簡單編程接口的需要。ADO是簡化OLEDB的應用程式編程接口(API) 。
ADO被設計為一種易於使用的套用級OLEDB接口。OLEDB提供對任何數據源的高性能訪問。數據源包括關係型和非關係型資料庫、電子郵件和檔案系統。ADO通過在應用程式和數據源之間提供最少的層數以提供輕負荷、高性能的接口。ADO訪問資料庫可以通過ADO數據控制項也可以通過ADO對象模型,使用數據控制項可視化效果好,使用方便但是不夠靈活。使用ADO對象模型較直接使用數據控制項複雜,但功能更強大,更靈活。其最主要的優點是易於使用、速度快、記憶體支出少和磁碟遺蹟小。
Oracle專用訪問技術
Pro*C/C++
Pro *C/C++是Oracle公司提供的在第三代高級程式設計語言中嵌入SQL語句來訪問資料庫的一套預編譯程式。程式設計師用Pro *C/C++編寫嵌入SQL語句的PRO源程式後運行預編譯程式,把嵌入的SQL語句轉換為標準的Oracle調用並生成目標源程式,即純高級語言格式的源程式,然後就可以將這些源程式加入用戶的程式中調用。
Oracle Pro*C/C++預編譯程式提供如下功能:
(1)能用C , Visual C++程式設計語言編寫應用程式;
(2)遵循ANSI標準,在高級語言中嵌入SQL語句;
(3)可採用動態SQL方法,在程式運行過程中接受或構造一個有效地SQL語句;
(4)實現Oracle內部數據類型和高級語言數據類型之間的自動轉換;
(5)可通過在應用程式中嵌入PL/S QL事務處理塊來改進性能;
(6)能全面檢查嵌入的SQL數據操縱語句和PL/SQL塊的文法和語義;
(7)可用SQL*Net並行存取多個地點的Oracle資料庫;
(8)提供了較強的異常處理功能。
0040
0040即Oracle Objects for OLE,是Oracle公司提供的快捷訪問Oracle資料庫的產品。它支持Microsoft公司的COM Automation and ActiveX技術,而且它支持多種程式語言,包括:VB, VC+ +, VF, Delphi等。0040由三部分組成:進程內的COM自動化服務(In-process COM Automation Server), C++類庫(the C++ classlibrary)以及Oracle數據控制項(the Oracle Data Contro 1) 。 0040的組件如圖所示。
快速資料庫存取
0040是基於COM的資料庫連通性工具,能夠無縫地聯合併最佳化對Oracle資料庫的訪問,同時具有易於使用的界面。基於它編程的靈活性和簡單性,0040可用於從web套用到n層客戶端/伺服器應用程式的多種環境。0040是專為使用Oracle資料庫伺服器而開發和發展的。它為Oracle提供易於訪問的獨特功能,而這些功能要從ODBC和基於OLE DB的組件(如ADO)使用則非常麻煩或者是不可訪問。由於這是一個本地驅動程式,0040通常可以提供從Windows客戶端到Oracle資料庫的最佳性能。它不會引起ODBC和OLE DB驅動程式的系統開銷。
OCI
OCI(Oracle Call Interface,即Oracle調用層接口)是Oracle公司提供的由頭檔案和庫函式等組成的訪問Oracle資料庫的應用程式編程接口(API)。它允許開發人員在第三代程式語言(包括C, C++, COBOL與FORTRAN)中通過SQL來操縱Oracle資料庫,而且OCI在一定程度上支持第三代程式語言的數據類型、語法等。OCI的顯著特點是全面支持Oracle的面向對象技術,同時OCI還具有如下的一些特點:
(1)非常有利於應用程式設計;
(2)高度控制應用程式的執行;
(3)允許開發人員套用已熟悉的第三代程式設計語言來套用OCI;
(4)支持動態SQL;
(5)幾乎所有的Oracle的開發工具都支持OCI;
(6)通過回調技術callback來實現動態綁定與定義;
(7)通過OCI的描述函式可以獲取Oracle資料庫的各種參數;
(8)增強了數據在DML語言中的套用。
套用OCI程式生成可執行應用程式的過程如圖所示。
快速資料庫存取
OCI是Oracle開發接口的底層實現,如ADO, ODBC都是在OCI上層的封裝。
由於OCI是比較底層的接口,少了很多層的封裝,因此其對Oracle資料庫的訪問靈活性和可控制性很強,能夠提供應用程式與Oracle資料庫的直接連線。也正是因為OCI是基於資料庫底層設計開發的,所以其訪問資料庫的設計較複雜,開發工作量較大。
OCL
OCL(Oracle Class Library)是OCI API函式封裝成的類庫,用高級類封裝了OCI調用,它隱藏了直接使用OCI的複雜性,並且保留了OCI的性能及所有本地事務的能力。使用OCL允許創建基於Oracle的小型、高速的應用程式,可以在應用程式中使用強大的、靈活多變的SQL語句而沒有任何限制。OCL包含了用來控制連線,執行SQL語句,存儲和處理查詢結果以及一些有用的、用來開發資料庫的公用類庫。
OCL模型簡介
OCL是在標準的C++類庫的基礎上,用ANSI C++開發的,因此在幾乎所有的C++編譯器上都可以運行,譬如:Microsoft Visual C++ 6.0及7.O,Borland C++Builder_5及6, Borland Kylix 3和基於Linux的gcc 2.96編譯器。同時,OCL在所有運行Oracle的平台上都具有良好的可移植性,程式無須太大修改即可運行在Unix/Linux/Windows甚至嵌入式環境下。OCL程式既具有SQL非過程性的優點,又具有第三代程式設計語言的過程性和靈活性,使開發的編程技術具有更強的數據處理能力。OCL具有以下功能:
(1)設計和開發高可定製的資料庫應用程式;
(2)最佳化應用程式中的數據處理性能;
(3)在不同平台上編譯同樣的應用程式;
(4)自動在Oracle內部數據與高級語言數據類型間轉換;
(5)快速存取數據記錄;
(6)在記憶體中緩衝查詢結果集;
(7)使用數組式的輸入/輸出程式變數;
(8)容易地調用存儲過程;
(9)獲取句柄錯誤;
(10)使用資料庫中的LONG欄位。
OCL的快速載入方法
OCL有兩種載入數據的方法:常規載入(conventional load)和直接路徑載入(direct path load)。常規載入執行帶有綁定變數的SQLINSERT語句,將數據插入到Oracle資料庫的表中。而直接路徑載入使用Oracle的數組接口特性,將數據先格式化為Oracle的數據塊,再將其直接寫到資料庫表中,不使用緩衝機制,它基本繞過了RDBMS的處理,降低了資料庫開銷。當需要將大批量的數據頻繁地導入到資料庫時,直接路徑載入比常規載入效率高,因為它只需一次解析SQL語句,數據綁定操作以及程式與資料庫之間來回的操作都顯著減少,而且資料庫對每一條數據的操作都是重複可知的,這給資料庫提供了最佳化執行的可能。
在把仿真結果寫入Oracle資料庫時,直接路徑載入具有明顯的優勢。其優點在於:不與其它用戶競爭資料庫資源,特別是進程占用CPU的時間;提高數據載入的速度,數據導入的總體時間明顯減少。圖是常規載入和直接路徑載入的示意圖。
快速資料庫存取
以上幾種資料庫訪問技術的比較
以上幾種資料庫訪問技術從大的方面分為通用資料庫訪問技術和Oracle資料庫專用訪問技術,其中ODBC和ADO為通用資料庫訪問技術,PRO*C/C++, 0040,OCI, OCL為Oracle資料庫專用訪問技術。
對於通用資料庫訪問技術,其最大優點為通用性好。ODBC由於有MFC的類庫支持而使得編程實現非常方便,同時可移植性也很強,在異構的資料庫之間移植也只需更改很少的一部分程式。但從ODBC的實現機制我們可以看到,應用程式需要經過ODBC驅動程式管理器和ODBC驅動程式兩層才能和資料庫通信接口建立聯繫,因此建立在ODBC上的應用程式的執行效率會相對低一些。ADO通過在應用程式和數據源之間提供最少的層數以提供輕負荷、高性能的接口。其最主要的優點是易於使用、速度較快、記憶體支出少和磁碟遺蹟小。
Oracle資料庫專用訪問技術充分利用了Oracle的特性,具有很高的效率。Pro *C/C++直接與通信接口聯繫,具有最高執行效率,支持嵌入式PL/SQL塊等Oracle自身特有的優點,但正因為這些特點,使得用Pro * C/C++開發出的應用程式無法向異構資料庫平台移植,而且開發周期相對較長、開發難度較大。0040技術套用簡單方便,但對於數據讀取操作的速度相對於通用資料庫技術沒有明顯優勢。OCI和OCL在數據讀寫方面的速度最快,但OCI調用的函式使用及參數定義複雜,不適合用於開發DTS的實時資料庫接口。鑒於DTS的實時性要求,應該在很短的時間內把大批量的仿真數據從實時資料庫存入離線資料庫,此時OCL的直接路徑載入方法非常適合。下面將詳細介紹OCL技術在DTS中的套用。
OCL的編程實現
在仿真開始之前,計算程式要從Oracle離線資料庫中讀取計算所用參數,設定仿真初始條件;在仿真過程中,每個步長的計算結束之後,要把實時資料庫中的仿真結果存入到Oracle資料庫中。在這兩個過程中分別用OCL技術編寫讀取程式和寫入程式。
讀取數據
在寫入或讀取資料庫的數據之前,首先要連線Oracle資料庫。OCL中的OraConnection類用於建立和控制與資料庫的連線,其他所有的類在運算元據庫伺服器之前都需要首先調用OraConnection類。使用OraConnection類時,在應用程式中需要包含頭檔案ocl.h,並連結動態程式庫檔案o cl.lib。建立連線之後,在OraQuery類中嵌入SQL語句,就可以進行查詢、刪除、修改等操作了。
存儲數據
在仿真過程中,採用OCL直接路徑載入方法存儲仿真結果。一個步長的仿真結果包括
①發電機有功功率、無功功率、轉速、功角、電
②負荷的有功功率、無功功率
③節點電壓幅值、相角和頻率
④線路的首、末端有功功率及無功功率等。
這些數據分別存儲在OUTPUTGEN , OUTPUTLOAD, OUTPUTNODE, OUTPUTLINE四個表中。
OCL技術的改進
在下一個步長的仿真數據到來之前,要把當前步長的仿真結果存儲到Oracle資料庫中。一個步長的仿真數據量比較大,且需要在較短的時間內把這批數據存儲到資料庫中,ADO, ODBC等通用的資料庫訪問技術數據載入速度慢,不能滿足DTS的實時性要求,而OCL技術在這方面具有明顯的速度優勢。
由上一節可知,傳統的OCL直接路徑載入分三步:第一,定義OraLoader對象並綁定到相應的表,調用createColumns()函式和beginLoad()函式,檢索表的列信息為載入做好準備。第二,調用putColumnData()函式載入數據。第三,調用finishLoad()函式把緩衝中的數據裝到表中。在仿真過程中需要頻繁地存儲數據,而第一步所用時間較多。
為了避免把時間浪費在相應表的綁定上,對傳統的OCL直接路徑載入方法進行改進:
第一,在存儲之前首先定義四個OraLoade:對象,分別綁定到OUTPUTGEN、OUTPUTLOAD, OUTPUTNODE, OUTPUTLINE四個表。
第二,每個步長的數據到來時,將數據直接存入已經綁定好的表中。當緩衝占滿後,OCL自動把數據裝到表中。
第三,仿真結束後再調用finishLoad()函式,把緩衝中剩餘的數據存入表中。改進的直接路徑載入方法避免了無意義的重複操作,數據載入效率提高。

共享記憶體

進程間通信方法和進程/執行緒的同步方法,採用共享記憶體技術實現進程間大批量數據的快速交換,用事件對象控制共享記憶體的讀寫同步。開發實踐證明,這種方法速度快、可靠性高、編程實現簡單、占用系統資源少,能夠很好的滿足實時性和可靠性的要求。
概念
記憶體映射檔案提供了一種獨特的記憶體管理特徵,它允許應用程式與通過指針訪問動態記憶體相同的方式訪問磁碟上的檔案。因此,可以在進程地址空間將磁碟上的檔案部分或者全部映射到特定地址範圍,然後通過指針訪問記憶體映射檔案中的內容。一旦該檔案被映射,就可以訪問它,就像整個檔案已經載入記憶體一樣,從而可以不必對檔案執行I/O操作,這對大數據量檔案來說存取效率較高。
優點
記憶體映射檔案的高效數據存取主要源於如下一些優點:
(1)系統採用“頁”方式進行數據傳輸。Win32系統的虛擬記憶體管理採用“頁”的方式進行數據管理,每頁為4KB大小,由虛擬記憶體管理器進行統一管理,虛擬記憶體管理器統一以相同的方式執行存檔讀寫操作,因此在每次存檔讀寫時都以4KB頁大小的次序進行讀寫,這樣可以減少讀寫次數,極大地提高讀寫能力。
(2)所有的I/O互動都在記憶體中以標準記憶體定址方式進行,其檔案讀寫在後台進行,對應用程式透明,因而在將數據從磁碟讀到記憶體的過程中不會出現性能上的瓶頸。
(3 )記憶體映射檔案提供了一種在需要時才將部分檔案數據映射到記憶體中的機制。該機制的好處在於應用程式只需要從大量數據中獲取一小部分數據而不必將所有的數據檔案讀到記憶體中,因此可以節約大量的記憶體。
共享記憶體是對將要在多個進程間映射和共享的記憶體區域(段)所作的映射。這是IPC(Inter Process Communication)的最捷徑,因為這種通信方式沒有中介(例如管道、訊息佇列等)。多個進程共同使用同一段物理記憶體空間,不需要數據的多次複製,提高了進程間的通信性能。其原理如圖所示。
快速資料庫存取
共享記憶體的套用
實時資料庫和暫態計算進程之間的數據交換如圖所示。本文對原有的數據交換方法進行了改進,圖的左邊為原來的通信模式,右邊為改進的通信模式。在原有的模型中,暫態計算模組向實時資料庫模組傳送的數據有步長信息和仿真結果,實時資料庫端向暫態計算進程傳送的數據有界面的操作/故障信息,所採用的通信方法為Windows Sockets和共享記憶體。在改進的模型中,採用具有雙向讀寫功能的共享記憶體方法實現了兩個模組的數據交換。
快速資料庫存取

相關詞條

熱門詞條

聯絡我們