摘 要:當今Web應用系統與數據庫系統連接方案可分為兩大類:一是服務器端數據庫連接;另一種是客戶端數據庫連接。
關鍵詞:WEB服務器 B/S ODBC CGI Web API ADO JDBC OBJECT WEB
B/S軟件的根本點就是以瀏覽器形式與用戶打交道,其軟件設計的重要內容是客戶端訪問數據庫的方法。基于Web的數據庫訪問技術是指:在客戶端安裝Web瀏覽器,作為用戶輸入查詢條件和顯示查詢結果的交互界面。用戶可以通過填寫表格或輸入關鍵字的方式來與WWW進行交互,當用戶單擊表格上的按鈕時,表格中的數據便發送到Web服務器。Web服務器介于Web瀏覽器與數據庫服務器之間,負責用戶輸入信息的接收。服務器將數據傳送至要被處理的腳本或應用程序,并在數據庫中查詢數據或將數據傳遞到數據庫中。最后,服務器將返回結果插入到HTML頁面,傳送至客戶端以響應用戶。這種交互性提高了用戶參與的積極性。
一、CGI訪問模式
CGI是外部應用程序與Web服務器交互的一個標準接口。CGI應用程序可以完成客戶端與服務器的交互操作。遵循CGI標準編寫的服務器端的可執行程序稱為CGI程序。按照CGI標準編寫的外部擴展應用程序可以處理客戶端輸入的協同工作數據,完成客戶端與服務器的交互操作,這在實際應用中非常有用,如可以編寫CGI外部擴展程序來訪問外部數據庫,客戶端用戶可以通過它和WWW服務器來進行數據查詢。CGI一般分兩種:標準CGI和緩沖CGI。所有的WWW服務器均應支持標準CGI,按標準CGI編寫的程序與具體的WWW服務器無關。而按緩沖CGI編寫的程序與WWW服務器有關。采用CGI訪問數據數據庫結構如圖1所示:

CGI工作原理
(1) 標準CGI
服務器是客戶端(如瀏覽器)與擴展程序之間的通道。當客戶端的用戶完成了一定輸入工作之后向服務器發出HTTP請求,服務器守護進程接收到該請求后,就創建一個子進程。該CGI子進程將CGI請求的有關數據設置成環境變量,在外部CGI程序與服務器間建立兩條數據通道(標準I/O),然后啟動URL指定的CGI程序,并與該子進程保持同步,以監測CGI程序的執行狀態。子進程通過標準輸出流將處理結果傳遞給服務器守護進程,守護進程再將處理結果作為應答消息回送到客戶端。外部CGI程序通過環境變量、命令行參數、標準輸入輸出與WWW服務器進行通訊,傳遞有關參數和處理結果。環境變量:當服務器守護進程創建子進程運行CGI程序時,設置相應的環境變量和命令行參數,以傳遞客戶端和服務器的有關信息給該子進程。*命令行參數:命令行參數僅在有HTML文檔中有ISINDEX查詢的情況下使用。*標準輸入輸出:當HTTP請求模式采用POST方式時,CGI程序通過標準輸入流和有關環境變量來獲取客戶端傳輸數據;如采用GET方式時,CGI程序直接通過環境變量獲取客戶端傳輸數據。當CGI程序要返回處理結果給客戶端時,它通過標準輸出流將該結果數據傳遞給服務器守護進程。
(2) 緩沖CGI
標準CGI使用Stdin/Stdout來進行數據通訊,這是由其最初開發環境所決定的。但是許多Windows環境下的編程工具是不支持這種I/0方式的,這時就不能用它們來開發基于標準CGI的應用程序。于是有些服務器提出了緩沖CGI的概念。緩沖CGI亦稱為WinCGI。此時CGI擴展程序與服務器間通過緩沖CGI而不是標準CGI進行通訊,而緩沖CGI與服務器間的通訊還是通過標準CGI接口。后者由WWW服務器的內置緩沖處理程序實現。緩沖CGI的工作原理與標準CGI相似,不同的是當服務器守護進程接收到客戶端的CGI請求時,所建立的CGI子進程除將CGI請求的有關數據設置成環境變量外,還將它們保存在輸入緩沖區中;通過緩沖處理程序在外部CGI程序與服務器間建立兩條數據通道。CGI子進程通過輸出緩沖區將處理結果傳遞給服務器守護進程。此處外部CGI程序通過環境變量和輸入/輸出緩沖區與WWW 服務器進行通訊,傳遞有關參數和處理結果。此處環境變量的意義同上,不過這些環境變量及其相應值保存在輸入緩沖區中。此外,輸入緩沖區中還存放客戶端的傳輸數據。輸出緩沖區用來存放擴展程序的處理結果。
(3) 標準CGI與緩沖CGI的區別
對CGI擴展程序而言,最主要差別在于數據的I/O不同:對緩沖CGI,服務器與CGI擴展程序間的數據交換是通過緩沖區;而標準CGI是通過標準I/O。使用緩沖CGI可選擇更多的開發工具,可以開發Windows95和Windows NT下的GUI擴展程序;而使用標準CGI所選用的開發工具必須支持標準I/O。只有少數幾種WWW服務器支持緩沖CGI,因此基于它的擴展程序兼容性不如標準CGI好。
CGI的跨平臺性能極佳,幾乎可以在任何操作系統上實現。但CGI的缺點也是顯而易見的:(1)效率低、速度慢:CGI的應用程序一般都是一個獨立的可執行程序,與Web服務器各自占據著不同的進程,而且一般一個CGI程序只能處理一個用戶請求。每當有一個用戶請求,就會激活一個CGI進程。當用戶請求數量非常多時,大量的CGI程序就會大量擠占系統的資源,如內存、CPU時間等,造成CGI運行效率低下。另外CGI的功能有限、開發較為復雜,且不具備事務處理(Transaction)功能,這在一定程度上限制了它的應用;(2)可移植性差:CGI方式的數據庫連接,只針對具體的數據庫,當需要修改DB的結構或增加數據庫時,程序改動量很大,靈活性差、維護困難;(3) 編程復雜:編寫CGI程序必須了解CG工規范、HTTP協議和WEB服務器運行原理。
二、 WebAPI技術
CGI運行效率較低,編程困難,Web服務器軟件廠商開發了基于各自的服務器API。WEB API通常以動態鏈接庫(DLL)的形式提供,是駐留在Web服務器上的程序,它的作用與CGI相似,也是為了擴展Web服務器的功能。目前最著名的Web API有Netscape的NSAPI。M icrosoft的ISAPI和O’Reilly的WSAPI。采用這種方式訪問數據庫結構如圖2所示:

各種API均與其相應的Web服務器緊密聯系在一起。為了解決復雜與高效之間的矛盾,Netscape與Microsoft均為各自的Web服務器提供了基于API的高級編程接口。Netscape提供的是LiveWire,而Microsoft則提供的是IDC。
基于API的用戶應用可實現CGI的全部功能,其作用與CGI類似,也是為了擴展WEB服務器的功能。但其運行機制與CGI不同,API應用以線程方式運行。API方式工作原理是:在服務器起動時,WEB服務器設置提供了指向這些API應用的通用接口,在首次被請求時,API應用被調入內存,執行完畢后,并不馬上消失,而是繼續駐留在內存中,與WEB服務器處于同一地址空間,當下一次被請求時,WEB服務器只是運行駐留在內存中的相應的API應用,這樣就避免了CGI程序每次請求都要重新啟動進程相當耗時的進程間的通信及與數據庫的連接,并且,可在一個API應用里設置多個用戶請求處理函數。因此,系統運行效率以及速度比CGI快得多。
采用Web API結構的優點:API應用程序是與Web服務器軟件處于同一地址空間的DLL,因此所有的HTTP服務器進程能夠直接利用各種資源,這顯然比調用不在同一地址空間的CGI程序所占用的系統時間要短,比CGI具有更高執行效率,客戶端響應時間也較短。其缺點:(1)可移植性差:由于各個Web服務器廠商紛紛推出自己的API,使得各種API之間的兼容性很差,開發API程序需要多線程、進程同步、直接協議編程等知識,其程序開發比CGI開發更困難。(2)此外健壯性也不好保證,這是由于API進行與Web服務器處于同一系統空間,服務器端一個違規操作有可能導致整個Web服務器的崩潰。
三、 ADO方式
ADO(ActiveX Data Object即ActiveX數據對象)是Microsoft在OLE DB標準的基礎上定義的一種面向對象、與語言無關的數據庫應用編程接口。如果選用ADO作為訪問Web數據庫接口,則最好方法是結合ASP來寫應用程序。ASP是微軟公司基于ActiveX技術的一個Web服務器端的開發和運行環境,只能運行在微軟提供的平臺如Windows NT和IIS等。ASP屬于服務器端技術,直接建立在服務器中,并且作為Web服務器的一個服務運行,支持多用戶、多線程;與其它常見的Client端實現動態性的技術如Java Applet。 ActiveX Control。JavaScript等不同,一個ASP頁面即可包含客戶端腳本,更主要的是也可包含服務器端腳本,引擎解釋執行,執行結果以HTML的形式返回給用戶。
采用ADO結合ASP訪問數據庫系統有如下優點:(1)與HTML完全結合,可以使用任何腳本語言,易于開發,易于維護:(2)所有服務器端腳本代碼均在服務端執行,有效地保護了開發者的知識產權,且支持任何一種瀏覽器;(3)面向對象,可充分利用現存的ActiveX組件,易于擴展Server端功能;(4)可以訪問非關系數據庫,這是其它方式無法實現的。
ADO方式明顯的缺點是:僅適用于微軟提供的一些平臺,且ASP程序是解釋型語言編寫的,運行速度相對較慢。
四、ODBC/JDBC數據庫連接模式
采用ODBC/JDBC的連接模式,基本結構如圖3所示。ODBC是一個中間件,它把一個應用的數據請求轉換為DBMS可以理解的命令。JDBC是JAVASOFT公司的規范,它建立了一個程序級的設計接口,在統一方式下與數據庫通迅,類似于ODBC概念。JDBC標準基于X/OPEN SQL調用級接口,與ODBC具有相同的基礎。Oracle與Sybase數據庫均支持ODBC/JDBC。

API方法與Web服務器結合緊密,所以性能較高。但是利用底層的API開發數據庫訪問程序仍然很困難,因此一般使用基于底層API的高層數據庫編程接口,這就是我們所說的ODBC。ODBC是“開放數據庫互連”的簡稱,是一種使用SQL的應用程序接口(API) 。ODBC一個最顯著的優點是用它生成的程序與數據庫或數據庫引擎是無關的。ODBC可使程序員方便地編寫訪問各種DBMS廠商的數據庫的應用程序,而不需了解其產品的細節。Web服務器通過數據庫驅動程序ODBC向數據庫服務器發出SQL請求,數據庫服務器接到的是標準的SQL查詢語句,數據管理系統執行SQL查詢并將查詢結果再通過ODBC傳回Web服務器。許多服務器擴展程序使用包含ODBC層的系統結構。ODBC是為調用關系數據庫提供統一途徑的一類API,由于它適用于許多不同的數據庫產品,因此是服務器擴展程序開發者們理所當然的選擇。
Java語言顯示出優于以往編程語言的諸多特色,贏得了眾多數據庫廠商的支持。為了同時連接到多個數據庫進行并行的聯合查詢,可以充分利用Java語言本身的特色。
在數據庫處理方面,Java提供了JDBC(Java數據庫連接:Java Database Connectivity),為數據庫開發應用提供了標準的應用程序編程接口。與ODBC類似,JDBC也是一種特殊的API,是用于執行SQL語句的Java應用程序接口(JavaAPI),它規定了Java如何與數據庫進行交互作用。JDBC由一組用Java語言寫的類和接口組成,利用Java機制設計的標準SQL數據庫連接接口JDBC去訪問數據庫。JDBC也是一種規范,其宗旨是讓各數據庫開發商為Java程序員提供標準的數據庫訪問類和接口。JDBC與Java結合,使用戶很容易地把SQL語句傳送到任何關系數據庫中,程序員用它編寫的數據庫應用軟件,可在各種數據庫系統上運行。采用JDBC可以很容易用SQL語句訪問任何商用數據庫,采用Java和JDBC編寫的數據庫應用程序具有與平臺無關的特性,很容易用SQL語句訪問任何商用數據庫,而不必為每一種數據庫平臺編寫不同的程序。
JDBC訪問數據庫的過程可采用兩種方式。一種是通過瀏覽器連接到Web服務器上,下載含有Java小程序的HTML頁,Java小程序在客戶端運行,使用JDBC接口,繞過Web服務器,直接與數據庫服務器交互,并直接把查詢結果的HTML頁返回到瀏覽器。另一種方式則是在WEB服務器端通過JAVA SERVERLETS與數據庫服務器交互。
五、幾種數據庫連接方式的比較
CGI根據瀏覽器端的http請求激活相應進程,每一個請求對應一個進程。當同時有很多請求時,程序擠占系統資源,造成效率低下。Web API針對這一缺點進行改進,利用DLL(動態鏈接庫)技術,以線程代替進程,提高了性能和速度,但要考慮線程的同步問題,而且開發步驟煩瑣。這兩種技術還存在另外一個問題,那就是開發困難。程序的開發和HTML寫作是兩個完全不同的過程,需要專門的程序員開發。而另一些較簡單的開發技術如JavaScript和IDC(Internet DatabaseConnector)等功能有限。
Microsoft的ODBC API是使用最廣泛的訪問數據庫規范。ODBC2.0 訪問數據庫時存在同步與異步執行模式之分,如果設計不當,則易發生系統故障甚至系統死鎖。但是同步執行模式可以簡化程序編制的復雜性。程序員不用過多地了解較復雜的ODBC 2.0 API的使用,而只需使用ODBC的同步執行模式或使用數據控制項和數據庫對象變量來編寫應用程序,可以提高開發效率,但程序運行速度比不上異步執行模式的速度。
JDBC保持了ODBC的基本特性。兩者都基于X/Open SQL調用級接口(CLI:CallLevelInterface)標準。它們的不同就在于JDBC建立在Java語言基礎上,并充分利用了其特色,易于使用;ODBC使用的是C界面,C語言大量使用了Java語言中沒有的指針功能,不適于以Java為界面的JDBC直接使用。同時,JDBC確保了“100%純Java”的解決方案。這樣,JDBC應用無需像ODBC應用那樣要進行客戶機的安裝和管理。
總之,在瀏覽器中訪問Web數據庫的方法較多,開發Web應用程序的軟件人員需要選擇適當的方法,但有些方法的編程接口較為復雜,妨礙了它的進一步應用。作為Web頁管理員,更希望把精力集中在信息發布或程序設計本身,而不愿意在接口方面耗費太多的精力。而通過三層結構中間層采用組件和分布式對象技術是今后Web數據庫系統發展方向。