日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Linux应用集成MySQL数据库访问技巧

發(fā)布時間:2023/12/18 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux应用集成MySQL数据库访问技巧 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文描述了MySQL,一種利用第三方數(shù)據(jù)庫開發(fā)電子貿(mào)易和其它復(fù)雜、動態(tài)網(wǎng)站的有效工具。MySQL 是一種快速、多線程和全功能的 SQL服務(wù)器。除了描述MySQL系統(tǒng)的基本體系結(jié)構(gòu)以外,本文還提供了以Tcl和C++編寫的簡單示例,幫助您開發(fā)支持?jǐn)?shù)據(jù)庫的Web應(yīng)用。一個必須存儲或訪問大量信息的應(yīng)用程序可以從使用第三方數(shù)據(jù)庫產(chǎn)品中受益匪淺。在對信息的訪問必須在程序的多個實(shí)例上進(jìn)行時更是如此。基于Web的應(yīng)用(包括電子貿(mào)易)就是它的良好例證。

為什么使用獨(dú)立數(shù)據(jù)庫?

Web服務(wù)器必須使其處理腳本有辦法來存儲有關(guān)供其以后訪問的狀態(tài)信息。盡管有可能使用比較原始一些的方法--例如轉(zhuǎn)儲到文本文件或開發(fā)自制的迷你數(shù)據(jù)庫--但只有成熟的數(shù)據(jù)庫應(yīng)用才能提供更為復(fù)雜的Web應(yīng)用所需的所有服務(wù)。因?yàn)橛幸恍┟赓M(fèi)獲得的軟件包可用于該目的,所以編寫定制的特定于應(yīng)用的數(shù)據(jù)庫引擎并無太大好處。 另外,使用第三方數(shù)據(jù)庫還使Web開發(fā)者不必投入到開發(fā)和維護(hù)數(shù)據(jù)庫的任務(wù)中。


MySQL數(shù)據(jù)庫

通過使用腳本語言和編譯型系統(tǒng)語言(例如 C),將數(shù)據(jù)庫集成到Linux應(yīng)用就可能相當(dāng)容易。可免費(fèi)獲得的MySQL(在GNU Public License下發(fā)行)數(shù)據(jù)庫提供了一系列復(fù)雜的SQL功能,并易于集成到應(yīng)用中。MySQL是快速、多線程的,并支持ANSI和ODBC SQL標(biāo)準(zhǔn)。加上第三方軟件,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)品沒有交付,或者庫存不實(shí)等都有可能是部分完成的事務(wù)的結(jié)果。支持事務(wù)處理的數(shù)據(jù)庫可以將一組數(shù)據(jù)庫代碼封裝在一個事務(wù)中,在事務(wù)執(zhí)行期間的任何失敗會讓數(shù)據(jù)庫回滾到事務(wù)開始之前的狀態(tài)。這是通過維護(hù)所有數(shù)據(jù)庫操作的日志,以及其原始狀態(tài)表的副本來實(shí)現(xiàn)的,在失敗后下一次重新啟動服務(wù)器時允許回滾操作。 這種時間和空間上的開銷是事務(wù)安全數(shù)據(jù)庫系統(tǒng)所必需的一種折衷。單一MySQL服務(wù)器控制著一系列數(shù)據(jù)庫,它們都可以通過服務(wù)器以類似方式來訪問。 每個數(shù)據(jù)庫實(shí)際上都是一組任意數(shù)量的表,概念與其它SQL數(shù)據(jù)庫的用戶類似。每個表都由帶類型的數(shù)據(jù)列組成。 數(shù)據(jù)可以是整數(shù)、實(shí)數(shù)值、字符串或其它類型,包括原始二進(jìn)制流。 表中的每一行都是存儲在數(shù)據(jù)庫中的一個記錄。

MySQL被設(shè)計(jì)和構(gòu)造成客戶機(jī)/服務(wù)器。 服務(wù)器mysqld可以在能從因特網(wǎng)訪問到的任何機(jī)器上運(yùn)行(最好與Web服務(wù)器在同一臺或最接近的一臺機(jī)器上,以確保合理的響應(yīng)時間)。MySQL客戶機(jī)使用請求來與MySQL服務(wù)器聯(lián)系,修改或查詢服務(wù)器所擁有的數(shù)據(jù)庫。 在支持?jǐn)?shù)據(jù)庫的Web應(yīng)用程序中,數(shù)據(jù)庫客戶機(jī)是Web服務(wù)器或由Web服務(wù)器產(chǎn)生的CGI腳本。 這些客戶機(jī)可以用高級腳本語言或低級系統(tǒng)語言編寫,只要存在這種語言的數(shù)據(jù)庫API即可。在Linux中,大多數(shù)腳本語言是以C 實(shí)現(xiàn)的,因?yàn)榇嬖贛ySQL C API,所以要將MySQL支持添加到任何現(xiàn)有的腳本語言或工具應(yīng)該很容易。絕大部分腳本語言已經(jīng)完成了這一步。


本新聞共3頁,當(dāng)前在第1頁? 1? 2? 3?


MySQL API

MySQL API可用于各種語言,包括幾乎所有編寫網(wǎng)站后端所實(shí)際使用的語言。 使用這些API,我們可以構(gòu)建由Web服務(wù)器控制的 MySQL客戶機(jī)。

API(用于數(shù)據(jù)庫訪問)以基于連接的模式工作。客戶機(jī)必須做的第一件事是打開與MySQL服務(wù)器的連接。 這包括適當(dāng)?shù)厥褂梅?wù)器認(rèn)識的用戶名和口令來對連接進(jìn)行身份認(rèn)證。建立了連接后,服務(wù)器選擇要使用的特定數(shù)據(jù)庫。 確定了初始化后,客戶機(jī)應(yīng)用程序(就我們來說是服務(wù)器方CGI腳本)就能自由地與數(shù)據(jù)庫以兩種方式中的一種進(jìn)行交互:可以運(yùn)行常規(guī)SQL命令,包括添加和刪除表,以及向它們添加記錄;也可以對返回結(jié)果的數(shù)據(jù)庫運(yùn)行查詢。 查詢生成一組與查詢匹配的記錄,然后,客戶機(jī)可以逐一訪問記錄,直到查看完所有記錄,或者客戶機(jī)取消暫掛的記錄檢索。一旦腳本完成了對數(shù)據(jù)庫的操作后,與服務(wù)器的連接就被關(guān)閉。

要構(gòu)建集成數(shù)據(jù)庫訪問的網(wǎng)站,需要編寫CGI腳本來根據(jù)數(shù)據(jù)庫狀態(tài)生成動態(tài)結(jié)果。Web服務(wù)器啟動CGI腳本,然后將適當(dāng)格式化的HTML輸出到它們的標(biāo)準(zhǔn)輸出流中。Web服務(wù)器捕捉到HTML后將它發(fā)送回客戶機(jī),如同請求是對靜態(tài)HTML頁面進(jìn)行的那樣。 在生成 HTML 的過程中,腳本可以修改數(shù)據(jù)庫,也可以查詢并將結(jié)果合并到它們的輸出中。

作為簡單解釋上述過程的一個示例,下面的代碼(以C和Tcl編寫)查詢一個包含某公司供銷售的產(chǎn)品清單的數(shù)據(jù)庫。 這絕沒有使用兩種語言MySQL API的所有特性,但提供了快速、簡易擴(kuò)展的示例,可以對數(shù)據(jù)庫內(nèi)容執(zhí)行任何SQL命令。 在該例中,腳本顯示了低于特定價格的所有產(chǎn)品。 在實(shí)踐中,用戶可能在Web瀏覽器中輸入該價格,然后將它發(fā)給服務(wù)器。 我們省去了從環(huán)境變量中進(jìn)行讀取來確定 HTML 表單值的細(xì)節(jié),因?yàn)樗c不支持?jǐn)?shù)據(jù)庫的 CGI 腳本中執(zhí)行的情況沒有什么差別。 為清晰起見,我們假設(shè)事先設(shè)置了特定一些參數(shù)(例如要查詢的價格)。

以下代碼是使用免費(fèi)獲得的Tcl Generic Database Interface以Tcl實(shí)現(xiàn)的。這樣一種接口的好處在于Tcl是解釋型的,可以對代碼進(jìn)行迅速開發(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 "<table border=4>"
puts "<th>Product Id <th width=200>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 0]
??? set descrip [lindex $row 1]
??? set price [lindex $row 2]
??? 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

本新聞共3頁,當(dāng)前在第2頁? 1? 2? 3?

?


下面的代碼是使用正式MySQL C++ API MySQL++以C++編寫的等價腳本。該版本的優(yōu)勢在于它是編譯型的,因此比解釋語言更快。經(jīng)常用在特定站點(diǎn)的數(shù)據(jù)庫代碼應(yīng)該以C或C++編寫,然后由腳本或直接由Web服務(wù)器訪問,以改進(jìn)整體運(yùn)行時間。

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 << "<table border=4>\n";
??? cout << "<th>Product Id <th width=200>Description"
? << "<th>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 << "<tr><td align=center>" << row[0]
????????? << "<td>" << row[1]
????????? << "<td>" << row[2] << endl;

??? }
??? cout << "</table>" << endl;

? } catch (BadQuery er) {
??? // handle a bad query (usually caused by a sql syntax error)
??? cerr << "Error: " << er.error <<? endl;
??? return -1;

? } catch (BadConversion er) {
?//handle conversion errors out of the database as

well
??? cerr << "Error: Can't convert \"" << er.data << "\" to a \""
? << er.type_name << "\"." << endl;
??? return -1;
? }
? return 0;
}
?
安全性

在Web上創(chuàng)建以Web支持的應(yīng)用有一些開發(fā)者需要考慮的問題。所有有關(guān)Web服務(wù)器上CGI程序的問題,例如Web服務(wù)器處理許可權(quán)和腳本方的輸入檢查,也仍然需要考慮。

除此之外,維護(hù)數(shù)據(jù)庫系統(tǒng)的安全性也很有必要。這涉及保護(hù)數(shù)據(jù)庫服務(wù)器的許可權(quán)系統(tǒng),以及使從數(shù)據(jù)庫客戶機(jī)到服務(wù)器的連接安全。

MySQL提供了深入的安全性系統(tǒng),有人形容它是“高級但不標(biāo)準(zhǔn)”。MySQL允許根據(jù)用戶名、客戶機(jī)主機(jī)和要訪問的數(shù)據(jù)庫對客戶機(jī)進(jìn)行訪問。要創(chuàng)建安全的系統(tǒng),讓所有用戶使用強(qiáng)口令,不要給他們?nèi)魏嗡麄儾皇墙^對需要的訪問權(quán)。這包括表面上無害的特權(quán),例如可以讓用戶查看所有正在運(yùn)行的進(jìn)程(包括更改其他用戶口令的那些)的處理特權(quán)。最好的辦法是以無特權(quán)的Unix用戶運(yùn)行服務(wù)器進(jìn)程本身,這樣如果一個數(shù)據(jù)庫被泄露,也不至于擊垮整個系統(tǒng)。 這與以用戶nobody而非root用戶運(yùn)行httpd類似。 描述系統(tǒng)訪問的表是作為單獨(dú)的MySQL數(shù)據(jù)庫存儲的,可以由MySQL root用戶更新。 請注意,MySQL服務(wù)器根據(jù)MySQL用戶名授予特權(quán),這些用戶名與Unix用戶名不同。不過,有一個MySQL root用戶名,它對數(shù)據(jù)庫有全部權(quán)限。 一旦服務(wù)器確定了連接客戶機(jī)是誰,以及它們在嘗試連接什么之后,就根據(jù)給定的一組權(quán)限來控制訪問權(quán)。要防止訪問表中主機(jī)名被DNS電子欺騙,可以輸入所有主機(jī)的IP地址,或請求服務(wù)器將IP地址解析回原始主機(jī)名來使其他人截獲DNS請求和回答更困難。

除了服務(wù)器訪問表以外,與服務(wù)器的通信也必須很安全。從客戶機(jī)登錄到服務(wù)器上時,口令不以純文本方式發(fā)送;不過所有后續(xù) SQL 命令將以純文本方式發(fā)送。為達(dá)到更高的安全性,使用ssh來設(shè)置端口轉(zhuǎn)發(fā)。它將服務(wù)器和客戶機(jī)之間的所有通信進(jìn)行加密,防止有人在傳輸中觀察它。來自客戶機(jī)的數(shù)據(jù)發(fā)送到客戶機(jī)本地機(jī)器中本地ssh服務(wù)器所偵聽的端口上。它由本地ssh服務(wù)器使用,加密后發(fā)送給遠(yuǎn)程ssh服務(wù)器,由它進(jìn)行解密并轉(zhuǎn)發(fā)到MySQL服務(wù)器端口。

在實(shí)際中,最安全的方法是在 Web 服務(wù)器所在的機(jī)器上運(yùn)行數(shù)據(jù)庫服務(wù)器,并讓由Web服務(wù)器產(chǎn)生的CGI腳本通過UNIX(本地)套接字與MySQL服務(wù)器進(jìn)行通信。該設(shè)置可以讓數(shù)據(jù)庫管理員禁用所有與MySQL服務(wù)器的遠(yuǎn)程連接。如果Web和數(shù)據(jù)庫服務(wù)器必須位于不同的機(jī)器上,加密它們之間的所有通信,或者將兩臺機(jī)器通過其自己專用的、物理上隔離的網(wǎng)絡(luò)連接。只創(chuàng)建一個由Web服務(wù)器使用的用戶帳戶(除 root 用戶外)以登錄到數(shù)據(jù)庫服務(wù)器。

由數(shù)據(jù)庫驅(qū)動的網(wǎng)站是一些功能強(qiáng)大的工具,可以讓開發(fā)者創(chuàng)建提供更新信息的動態(tài)站點(diǎn),并讓由客戶機(jī)發(fā)起的更改在多個會話之間持續(xù)。后端數(shù)據(jù)庫的使用對于管理電子貿(mào)易和其它應(yīng)用的用戶來說必不可少。通過使用可免費(fèi)獲得的軟件,有可能建立由數(shù)據(jù)庫驅(qū)動的站點(diǎn),安全地將數(shù)據(jù)庫連通性集成到站點(diǎn)現(xiàn)有的CGI體系結(jié)構(gòu)中。

參考資料

您可以參閱本文在developerWorks全球站點(diǎn)上的英文原文.

有關(guān)最新新聞和文章,請?jiān)L問MySQL主頁。

在MySQL++上查找C++與MySQL的正式接口。

Tcl GDBI( Generic Database Interface)是用在本文中Tcl示例中的Tcl MySQL API。

詳細(xì)了解用于加密 MySQL 客戶機(jī)和服務(wù)器之間所有通信的Secure Shell (ssh)。它用在不可信網(wǎng)絡(luò)(例如公共因特網(wǎng)任意部分)上進(jìn)行的通信中。

轉(zhuǎn)載于:https://www.cnblogs.com/junzhongxu/archive/2008/07/10/1239675.html

總結(jié)

以上是生活随笔為你收集整理的Linux应用集成MySQL数据库访问技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。