熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

Linux應用集成MySQL數據庫訪問技巧

2013-11-23 21:02:45  來源: MySQL 

  本文描述了MySQL一種利用第三方數據庫開發電子貿易和其它復雜動態網站的有效工具MySQL 是一種快速多線程和全功能的 SQL服務器除了描述MySQL系統的基本體系結構以外本文還提供了以Tcl和C++編寫的簡單示例幫助您開發支持數據庫的Web應用
  
  一個必須存儲或訪問大量信息的應用程序可以從使用第三方數據庫產品中受益匪淺在對信息的訪問必須在程序的多個實例上進行時更是如此基於Web的應用(包括電子貿易)就是它的良好例證
  
  為什麼使用獨立數據庫?
  
  Web服務器必須使其處理腳本有辦法來存儲有關供其以後訪問的狀態信息盡管有可能使用比較原始一些的方法例如轉儲到文本文件或開發自制的迷你數據庫但只有成熟的數據庫應用才能提供更為復雜的Web應用所需的所有服務因為有一些免費獲得的軟件包可用於該目的所以編寫定制的特定於應用的數據庫引擎並無太大好處 另外使用第三方數據庫還使Web開發者不必投入到開發和維護數據庫的任務中
  
  MySQL數據庫
  
  通過使用腳本語言和編譯型系統語言(例如 C)將數據庫集成到Linux應用就可能相當容易可免費獲得的MySQL(在GNU Public License下發行)數據庫提供了一系列復雜的SQL功能並易於集成到應用中MySQL是快速多線程的並支持ANSI和ODBC SQL標准加上第三方軟件MySQL就支持用於事務處理應用的事務安全的表
  
  注什麼是事務處理?
  
  事務是需要以原子方式執行的對數據庫所做的一系列更改它們要麼必須全部執行要麼一個都不執行 例如在Web上銷售產品時所有必需的數據庫更改組成一個事務
  
  數據庫需要同時減去客戶帳戶余額和產品庫存否則失敗並且一個操作都不執行
  
  無論服務器出於何種原因發生崩潰都不應該引起事務被部分執行例如帳單多算產品沒有交付或者庫存不實等都有可能是部分完成的事務的結果
  
  支持事務處理的數據庫可以將一組數據庫代碼封裝在一個事務中在事務執行期間的任何失敗會讓數據庫回滾到事務開始之前的狀態
  
  這是通過維護所有數據庫操作的日志以及其原始狀態表的副本來實現的在失敗後下一次重新啟動服務器時允許回滾操作 這種時間和空間上的開銷是事務安全數據庫系統所必需的一種折衷
  
  單一MySQL服務器控制著一系列數據庫它們都可以通過服務器以類似方式來訪問 每個數據庫實際上都是一組任意數量的表概念與其它SQL數據庫的用戶類似每個表都由帶類型的數據列組成 數據可以是整數實數值字符串或其它類型包括原始二進制流 表中的每一行都是存儲在數據庫中的一個記錄
  
  MySQL被設計和構造成客戶機/服務器 服務器mysqld可以在能從因特網訪問到的任何機器上運行(最好與Web服務器在同一台或最接近的一台機器上以確保合理的響應時間)MySQL客戶機使用請求來與MySQL服務器聯系修改或查詢服務器所擁有的數據庫 在支持數據庫的Web應用程序中數據庫客戶機是Web服務器或由Web服務器產生的CGI腳本 這些客戶機可以用高級腳本語言或低級系統語言編寫只要存在這種語言的數據庫API即可在Linux中大多數腳本語言是以C 實現的因為存在MySQL C API所以要將MySQL支持添加到任何現有的腳本語言或工具應該很容易絕大部分腳本語言已經完成了這一步
  
  MySQL API
  
  MySQL API可用於各種語言包括幾乎所有編寫網站後端所實際使用的語言 使用這些API我們可以構建由Web服務器控制的 MySQL客戶機
  
  API(用於數據庫訪問)以基於連接的模式工作客戶機必須做的第一件事是打開與MySQL服務器的連接 這包括適當地使用服務器認識的用戶名和口令來對連接進行身份認證建立了連接後服務器選擇要使用的特定數據庫 確定了初始化後客戶機應用程序(就我們來說是服務器方CGI腳本)就能自由地與數據庫以兩種方式中的一種進行交互可以運行常規SQL命令包括添加和刪除表以及向它們添加記錄也可以對返回結果的數據庫運行查詢 查詢生成一組與查詢匹配的記錄然後客戶機可以逐一訪問記錄直到查看完所有記錄或者客戶機取消暫掛的記錄檢索一旦腳本完成了對數據庫的操作後與服務器的連接就被關閉
  
  要構建集成數據庫訪問的網站需要編寫CGI腳本來根據數據庫狀態生成動態結果Web服務器啟動CGI腳本然後將適當格式化的HTML輸出到它們的標准輸出流中Web服務器捕捉到HTML後將它發送回客戶機如同請求是對靜態HTML頁面進行的那樣 在生成 HTML 的過程中腳本可以修改數據庫也可以查詢並將結果合並到它們的輸出中
  
  作為簡單解釋上述過程的一個示例下面的代碼(以C和Tcl編寫)查詢一個包含某公司供銷售的產品清單的數據庫 這絕沒有使用兩種語言MySQL API的所有特性但提供了快速簡易擴展的示例可以對數據庫內容執行任何SQL命令 在該例中腳本顯示了低於特定價格的所有產品 在實踐中用戶可能在Web浏覽器中輸入該價格然後將它發給服務器 我們省去了從環境變量中進行讀取來確定 HTML 表單值的細節因為它與不支持數據庫的 CGI 腳本中執行的情況沒有什麼差別 為清晰起見我們假設事先設置了特定一些參數(例如要查詢的價格)
  
  以下代碼是使用免費獲得的Tcl Generic Database Interface以Tcl實現的這樣一種接口的好處在於Tcl是解釋型的可以對代碼進行迅速開發和快速修改
  
  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/tclsql/sqlso
  
  #these are well defined beforehand or they could
  #be passed into the script
  set DBNAME clientWebSite;
  set TBLNAME products;
  set DBHOST
  set DBUSER mysqluser
  set DBPASSWD abigsecret
  
  set targetPrice ;
  
  #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 <table border=>
  puts <th>Product Id <th width=>Description <th>Price (\$)
  
  #output table rows each fetchrow retrieves one result
  #from the sql query
  while {[set row [sql fetchrow $handle]] != } {
    set prodid [lindex $row ]
    set descrip [lindex $row ]
    set price [lindex $row ]
    puts <tr><td>$prodid <td align=center>$descrip <td>$price
  }
  
  puts </table>
  
  #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++編寫的等價腳本該版本的優勢在於它是編譯型的因此比解釋語言更快經常用在特定站點的數據庫代碼應該以C或C++編寫然後由腳本或直接由Web服務器訪問以改進整體運行時間
  
  C++示例
  
  #include
  #include
  #include
  
  const char *DBNAME = clientWebSite;
  const char *DBTABLE = products;
  const char *DBHOST = ;
  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 = conquery();
  
    //write valid sql code to the query object
    query << select * from << DBTABLE;
  
    //run the query and store the results
    Result res = querystore();
  
    //write out the html table header
    cout << <table border=>\n;
    cout << <th>Product Id <th width=>Description
   << <th>Price ($) << endl;
  
    Result::iterator curResult;
   Row row;
  
    //iterate over each result and put it into an html table
    for (curResult = resbegin(); curResult != resend(); curResult++) {
     row = *curResult;
     cout << <tr><td align=center> << row[]
        << <td> << row[]
From:http://tw.wingwit.com/Article/program/MySQL/201311/29497.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.