国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

將數(shù)據(jù)庫訪問集成到 Linux 應(yīng)用中

2024-07-21 02:38:25
字體:
供稿:網(wǎng)友

  作者:于明儉 構(gòu)建由數(shù)據(jù)庫支持的網(wǎng)站 本文描述了 MySQL,一種利用第三方數(shù)據(jù)庫開發(fā)電子貿(mào)易和其它復(fù)雜、動態(tài)網(wǎng)站的有效工具。MySQL 是一種快速、多線程和全功能的 SQL 服務(wù)器。除了描述 MySQL 系統(tǒng)的基本體系結(jié)構(gòu)以外,本文還提供了以 Tcl 和 C++ 編寫的簡單示例,幫助您開發(fā)支持數(shù)據(jù)庫的 Web 應(yīng)用。 一個必須存儲或訪問大量信息的應(yīng)用程序可以從使用第三方數(shù)據(jù)庫產(chǎn)品中受益匪淺。在對信息的訪問必須在程序的多個實例上進行時更是如此。基于 Web 的應(yīng)用(包括電子貿(mào)易)就是它的良好例證。 為什么使用獨立數(shù)據(jù)庫? Web 服務(wù)器必須使其處理腳本有辦法來存儲有關(guān)供其以后訪問的狀態(tài)信息。盡管有可能使用比較原始一些的方法 -- 例如轉(zhuǎn)儲到文本文件或開發(fā)自制的迷你數(shù)據(jù)庫 -- 但只有成熟的數(shù)據(jù)庫應(yīng)用才能提供更為復(fù)雜的 Web 應(yīng)用所需的所有服務(wù)。因為有一些免費獲得的軟件包可用于該目的,所以編寫定制的特定于應(yīng)用的數(shù)據(jù)庫引擎并無太大好處。 另外,使用第三方數(shù)據(jù)庫還使 Web 開發(fā)者不必投入到開發(fā)和維護數(shù)據(jù)庫的任務(wù)中。 MySQL 數(shù)據(jù)庫 通過使用腳本語言和編譯型系統(tǒng)語言(例如 C),將數(shù)據(jù)庫集成到 linux 應(yīng)用就可能相當輕易。可免費獲得的 MySQL(在 GNU Public License 下發(fā)行)數(shù)據(jù)庫提供了一系列復(fù)雜的 SQL 功能,并易于集成到應(yīng)用中。MySQL 是快速、多線程的,并支持 ANSI 和 ODBC SQL 標準。加上第三方軟件,MySQL 就支持用于事務(wù)處理應(yīng)用的事務(wù)安全的表。 什么是事務(wù)處理? 事務(wù)是需要以原子方式執(zhí)行的對數(shù)據(jù)庫所做的一系列更改。它們要么必須全部執(zhí)行,要么一個都不執(zhí)行。 例如,在 Web 上銷售產(chǎn)品時所有必需的數(shù)據(jù)庫更改組成一個事務(wù)。 數(shù)據(jù)庫需要同時減去客戶帳戶余額和產(chǎn)品庫存,否則失敗并且一個操作都不執(zhí)行。 無論服務(wù)器出于何種原因發(fā)生崩潰都不應(yīng)該引起事務(wù)被部分執(zhí)行。例如帳單多算、產(chǎn)品沒有交付,或者庫存不實等都有可能是部分完成的事務(wù)的結(jié)果。 支持事務(wù)處理的數(shù)據(jù)庫可以將一組數(shù)據(jù)庫代碼封裝在一個事務(wù)中,在事務(wù)執(zhí)行期間的任何失敗會讓數(shù)據(jù)庫回滾到事務(wù)開始之前的狀態(tài)。 這是通過維護所有數(shù)據(jù)庫操作的日志,以及其原始狀態(tài)表的副本來實現(xiàn)的,在失敗后下一次重新啟動服務(wù)器時答應(yīng)回滾操作。 這種時間和空間上的開銷是事務(wù)安全數(shù)據(jù)庫系統(tǒng)所必需的一種折衷。 單一 MySQL 服務(wù)器控制著一系列數(shù)據(jù)庫,它們都可以通過服務(wù)器以類似方式來訪問。 每個數(shù)據(jù)庫實際上都是一組任意數(shù)量的表,概念與其它 SQL 數(shù)據(jù)庫的用戶類似。每個表都由帶類型的數(shù)據(jù)列組成。 數(shù)據(jù)可以是整數(shù)、實數(shù)值、字符串或其它類型,包括原始二進制流。 表中的每一行都是存儲在數(shù)據(jù)庫中的一個記錄。 MySQL 被設(shè)計和構(gòu)造成客戶機/服務(wù)器。 服務(wù)器 mysqld 可以在能從因特網(wǎng)訪問到的任何機器上運行(最好與 Web 服務(wù)器在同一臺或最接近的一臺機器上,以確保合理的響應(yīng)時間)。 MySQL 客戶機使用請求來與 MySQL 服務(wù)器聯(lián)系,修改或查詢服務(wù)器所擁有的數(shù)據(jù)庫。 在支持數(shù)據(jù)庫的 Web 應(yīng)用程序中,數(shù)據(jù)庫客戶機是 Web 服務(wù)器或由 Web 服務(wù)器產(chǎn)生的 CGI 腳本。 這些客戶機可以用高級腳本語言或低級系統(tǒng)語言編寫,只要存在這種語言的數(shù)據(jù)庫 API 即可。在 Linux 中,大多數(shù)腳本語言是以 C 實現(xiàn)的,因為存在 MySQL C API,所以要將 MySQL 支持添加到任何現(xiàn)有的腳本語言或工具應(yīng)該很輕易。絕大部分腳本語言已經(jīng)完成了這一步。 MySQL API MySQL API 可用于各種語言,包括幾乎所有編寫網(wǎng)站后端所實際使用的語言。 使用這些 API,我們可以構(gòu)建由 Web 服務(wù)器控制的 MySQL 客戶機。 API(用于數(shù)據(jù)庫訪問)以基于連接的模式工作。客戶機必須做的第一件事是打開與 MySQL 服務(wù)器的連接。 這包括適當?shù)厥褂梅?wù)器熟悉的用戶名和口令來對連接進行身份認證。建立了連接后,服務(wù)器選擇要使用的特定數(shù)據(jù)庫。 確定了初始化后,客戶機應(yīng)用程序(就我們來說是服務(wù)器方 CGI 腳本)就能自由地與數(shù)據(jù)庫以兩種方式中的一種進行交互:可以運行常規(guī) SQL 命令,包括添加和刪除表,以及向它們添加記錄;也可以對返回結(jié)果的數(shù)據(jù)庫運行查詢。 查詢生成一組與查詢匹配的記錄,然后,客戶機可以逐一訪問記錄,直到查看完所有記錄,或者客戶機取消暫掛的記錄檢索。一旦腳本完成了對數(shù)據(jù)庫的操作后,與服務(wù)器的連接就被關(guān)閉。
要構(gòu)建集成數(shù)據(jù)庫訪問的網(wǎng)站,需要編寫 CGI 腳本來根據(jù)數(shù)據(jù)庫狀態(tài)生成動態(tài)結(jié)果。Web 服務(wù)器啟動 CGI 腳本,然后將適當格式化的 Html 輸出到它們的標準輸出流中。Web 服務(wù)器捕捉到 HTML 后將它發(fā)送回客戶機,如同請求是對靜態(tài) HTML 頁面進行的那樣。 在生成 HTML 的過程中,腳本可以修改數(shù)據(jù)庫,也可以查詢并將結(jié)果合并到它們的輸出中。 作為簡單解釋上述過程的一個示例,下面的代碼(以 C 和 Tcl 編寫)查詢一個包含某公司供銷售的產(chǎn)品清單的數(shù)據(jù)庫。 這絕沒有使用兩種語言 MySQL API 的所有特性,但提供了快速、簡易擴展的示例,可以對數(shù)據(jù)庫內(nèi)容執(zhí)行任何 SQL 命令。 在該例中,腳本顯示了低于特定價格的所有產(chǎn)品。 在實踐中,用戶可能在 Web 瀏覽器中輸入該價格,然后將它發(fā)給服務(wù)器。 我們省去了從環(huán)境變量中進行讀取來確定 HTML 表單值的細節(jié),因為它與不支持數(shù)據(jù)庫的 CGI 腳本中執(zhí)行的情況沒有什么差別。 為清楚起見,我們假設(shè)事先設(shè)置了特定一些參數(shù)(例如要查詢的價格)。 以下代碼是使用免費獲得的 Tcl Generic Database Interface 以 Tcl 實現(xiàn)的。這樣一種接口的好處在于 Tcl 是解釋型的,可以對代碼進行迅速開發(fā)和快速修改。 Tcl 示例 #This code PRints out all prodUCts in the database # that are below a specified price (assumed to have been determined # beforehand, and stored in the variable targetPrice) # The output is in HTML table format, appropriate for CGI output #load the SQL shared object library. the Tcl interpreter could also #have been compiled with the library, making this line unnecessary load /home/aroetter/tcl-sql/sql.so #these are well defined beforehand, or they could #be passed into the script set DBNAME "clientWebSite"; set TBLNAME "products"; set DBHOST "backend.company.com" set DBUSER "mysqluser" set DBPASSWD "abigsecret" set targetPrice 200; #connect to the database set handle [sql connect $DBHOST $DBUSER $DBPASSWD] sql selectdb $handle $DBNAME ;# get test database #run a query using the specified sql code sql query $handle "select * from $TBLNAME where price <= $targetPrice" #print out html table header puts "" puts "Product Id Description Price (/$)" #output table rows - each fetchrow retrieves one result #from the sql query while {[set row [sql fetchrow $handle]] != ""} { set prodid [lindex $row 0] set descrip [lindex $row 1] set price [lindex $row 2] puts "$prodid $descrip $price" } puts "" #empty the query result buffer - should already be empty in this case sql endquery $handle #close the db connection - in practice this same connection #is used for multiple queries sql disconnect $handle 下面的代碼是使用正式 MySQL C++ API MySQL++ 以 C++ 編寫的等價腳本。該版本的優(yōu)勢在于它是編譯型的,因此比解釋語言更快。經(jīng)常用在特定站點的數(shù)據(jù)庫代碼應(yīng)該以 C 或 C++ 編寫,然后由腳本或直接由 Web 服務(wù)器訪問,以改進整體運行時間。 C++ 示例 #include #include
#include const char *DBNAME = "clientWebSite"; const char *DBTABLE = "products"; const char *DBHOST = "backend.company.com"; const char *DBUSER = "mysqluser"; const char *DBPASSWD = "abigsecret": int main() { try { //open the database connection and query Connection con(DBNAME, DBHOST, DBUSER, DBPASSWD); Query query = con.query(); //write valid sql code to the query object query << "select * from " << DBTABLE; //run the query and store the results Result res = query.store(); //write out the html table header cout << "/n"; cout << "Product Id Description" << "Price ($)" << endl; Result::iterator curResult; Row row; //iterate over each result and put it into an html table for (curResult = res.begin(); curResult != res.end(); curResult++) { row = *curResult; cout << "" << row[0]<

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 栾川县| 吉林省| 通河县| 海南省| 宜兰县| 凌云县| 枣庄市| 泾川县| 佳木斯市| 苗栗市| 类乌齐县| 白河县| 永靖县| 峨眉山市| 陕西省| 全南县| 定襄县| 武清区| 永川市| 兰西县| 思南县| 南和县| 资中县| 清徐县| 谷城县| 麻栗坡县| 肥西县| 汕头市| 株洲县| 津市市| 曲阳县| 崇礼县| 加查县| 通化县| 阿勒泰市| 咸宁市| 彭阳县| 阳城县| 汝阳县| 齐齐哈尔市| 隆尧县|