欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Node.js數(shù)據(jù)庫操作之連接MySQL數(shù)據(jù)庫(一)

 更新時間:2017年03月04日 16:07:17   作者:Corner  
前一陣在做項目的時候,需要通過nodejs連接到MySQL數(shù)據(jù)庫,于是簡單地學習了一下MySQL這個庫,分享一些學習心得給大家,希望對大家有幫助。下面這篇文章主要介紹了Node.js數(shù)據(jù)庫操作之連接MySQL數(shù)據(jù)庫的相關資料,需要的朋友可以參考下。

介紹

首先說來介紹一下MySQL(非廣告)。MySQL是由瑞典的MySQL AB公司開發(fā),后來被甲骨文公司收購。和Oracle一樣,MySQL是一個典型的關系型數(shù)據(jù)庫,在百度百科中,把MySQL稱為是最好的關系數(shù)據(jù)庫管理系統(tǒng)的之一。

什么是關系型數(shù)據(jù)庫和非關系型數(shù)據(jù)庫

說到關系型數(shù)據(jù)庫,大家肯定就會想到另一個詞與之對應,非關系型數(shù)據(jù)庫,那么這兩者有什么樣的區(qū)別呢?

關系型數(shù)據(jù)庫是指采用了關系模型(指的是二維表格模型)來組織數(shù)據(jù)的數(shù)據(jù)庫,有穩(wěn)定的表結(jié)構(gòu);而非關系型數(shù)據(jù)庫中的數(shù)據(jù)沒有關系模型,以對象的形式存放到數(shù)據(jù)庫中,對象之間的關系是通過每個對象的屬性來決定的,有點類似于一長串json對象。典型的非關系型數(shù)據(jù)庫有MongoDB和Redis。

MySQL的優(yōu)缺點

我在項目中使用MySQL作為數(shù)據(jù)庫主要是因為它體積小,速度快,安裝完才幾百兆,相比于Oracle好幾個G它確實“輕”了不少。而且核心程序采用多線程編程,線程也是輕量級的進程,不會占用太多的系統(tǒng)資源,因此一般的中小型網(wǎng)站都選擇MySQL數(shù)據(jù)庫,而且最重要的是MySQL幾乎是免費的。

但是也正是由于它的輕量級,因此它也“砍掉”了一些功能,比如存儲過程等。

使用

這邊不再贅述MySQL的安裝過程,有需要的讀者可以自行百度安裝教程。在我們的項目中通過npm install mysql --save來安裝依賴。

一個簡單的Demo

首先,通過一個小的Demo來測試我們的環(huán)境是否已經(jīng)搭建完畢了:

var mysql = require('mysql');
// 連接數(shù)據(jù)庫的配置
var connection = mysql.createConnection({
 // 主機名稱,一般是本機
 host: 'localhost',
 // 數(shù)據(jù)庫的端口號,如果不設置,默認是3306
 port: 3306
 // 創(chuàng)建數(shù)據(jù)庫時設置用戶名
 user: 'xyf',
 // 創(chuàng)建數(shù)據(jù)庫時設置的密碼
 password: 'xyf',
 // 創(chuàng)建的數(shù)據(jù)庫
 database: 'xyf_db'
});
// 與數(shù)據(jù)庫建立連接
connection.connect();
// 查詢數(shù)據(jù)庫
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
 if (err) throw err;
 console.log('The solution is: ', rows[0].solution);
});
// 關閉連接
connection.end();

運行程序,如果顯示“The solution is: 2”,那么整個連接查詢是成功的;如果不成功,讀者可以根據(jù)打印的錯誤信息提示來修改。

在查詢完數(shù)據(jù)庫后,需要通過end()函數(shù)將連接關閉。如果連接一直打開,首先會浪費不必要的系統(tǒng)資源;其次,數(shù)據(jù)庫的連接數(shù)量有限制,如果達到上限時,會出現(xiàn)后續(xù)連接不上報錯的情況。

建立數(shù)據(jù)庫連接

要想查詢數(shù)據(jù)庫,首先就要跟數(shù)據(jù)庫建立連接,上面的Demo給出了一種建立連接的方式。官方文檔還給出了另外兩種建立連接的方式。

隱式建立連接

var mysql = require('mysql');
var connection = mysql.createConnection(...);
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
 if (err) throw err;
 console.log('The solution is: ', rows[0].solution);
});
connection.end();

我們并沒有像Demo中一樣使用connect()函數(shù)建立連接,而且直接進行了查詢,這時候建立連接將會被隱式地調(diào)用。

連接回調(diào)查詢

上面兩種連接方式并沒有對連接出錯的情況進行處理,一旦連接出現(xiàn)錯誤將帶來連鎖的多米諾骨牌效應,查詢也將會失敗,整個程序也會崩潰,為了避免出現(xiàn)這樣的情況,我們將查詢和關閉連接放到回調(diào)函數(shù)中。

var mysql = require('mysql');
var connection = mysql.createConnection(...);
connection.connect(function(err){
 if(err){
 // 連接失敗時的錯誤處理
 console.log(err);
 return;
 } 
 connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
 if(err){
 // 查詢失敗時的錯誤處理
 console.log(err);
 return err;
 }
 console.log('The solution is: ', rows[0].solution);
 });
 connection.end();
});

注:上面的三種建立連接的方式都是可以的,取決于筆者怎么處理連接錯誤。

關閉連接

打開了數(shù)據(jù)庫的連接我們也需要關閉連接,有兩種關閉連接的方式,一種就是我們上面用的end()方法來關閉連接,它可以接收一個回調(diào)函數(shù)。

connection.end(function(err) {
 // 這時連接已經(jīng)被關閉了
});

通過end()函數(shù)關閉連接不會影響隊列中的查詢。還有一種方式是調(diào)用destroy()函數(shù)。

connection.destroy();

destroy()函數(shù)確保了沒有更多的時間和回調(diào)會觸發(fā)連接。同時destroy()函數(shù)也沒有回調(diào)函數(shù)。

使用數(shù)據(jù)庫連接池

數(shù)據(jù)庫連接是一種關鍵的、有限的、昂貴的資源。 —百度百科

通過上面的數(shù)據(jù)庫連接方式我們會發(fā)現(xiàn)直接創(chuàng)建一個數(shù)據(jù)庫連接比較“危險”,因為有很多種可能性導致連接的失敗。而且如果我們的程序中隨意都可以和數(shù)據(jù)庫建立連接的話,我們的程序就比較得混亂,不能很有效的管理數(shù)據(jù)庫連接。mysql庫提供了另一種數(shù)據(jù)庫連接方式給我們。

什么是數(shù)據(jù)庫連接池

數(shù)據(jù)庫連接池負責分配、管理和釋放數(shù)據(jù)庫連接,它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個。這項技術能明顯提高對數(shù)據(jù)庫操作的性能。

用一個很生動的例子來形容數(shù)據(jù)庫連接池的工作:以前我們存取錢都需要去銀行的柜臺交易,銀行的柜臺數(shù)量是有限的,人多的時候還需要排隊;現(xiàn)在我們把錢都存在了支付寶上,每次需要用錢的時候都直接跟支付寶“要”,不需要再跑到銀行去了,所有和銀行“打交道”的業(yè)務都交給了支付寶幫我們來管理。

數(shù)據(jù)庫連接池在初始化的時候?qū)⒁欢〝?shù)量(數(shù)量受最小連接數(shù)制約)的數(shù)據(jù)庫連接存放到數(shù)據(jù)庫連接池中,不管這些數(shù)據(jù)庫連接是否被使用,連接池一直要存放這么多的連接數(shù)量。連接池的最大數(shù)據(jù)庫連接數(shù)量限制了連接池最多能同時擁有的連接數(shù),如果超過最大連接數(shù)時,請求將會被添加到等待隊列中去。

創(chuàng)建連接池

下面就開始創(chuàng)建一個數(shù)據(jù)庫連接池。

var mysql = require('mysql');
var pool=mysql.createPool({
 host: 'localhost',
 user: 'xyf',
 password: 'xyf',
 port: '3306',
 database: 'xyf_db',
 // 最大連接數(shù),默認為10
 connectionLimit: 10,
})
pool.getConnection(function(err,connection){
 if(err){
 console.log(err);
 return;
 }
 connection.query('SELECT 1 + 1 AS solution',function(err,result){
 connection.release();
 if(err){
 console.log(err);
 return;
 }
 console.log('The solution is: ', result[0].solution);
 })
})

首先我們通過createPool()方法創(chuàng)建了一個數(shù)據(jù)庫連接池,它的配置參數(shù)和上面的配置基本差不多,只是多了一個最大連接數(shù)。每次我們需要和數(shù)據(jù)庫建立連接的時候不再是直接建立連接,而是去連接池中通過pool.getConnection()方法“撈取”已有的連接。這個方法有一個回調(diào),數(shù)據(jù)庫連接作為回調(diào)參數(shù)返回給我們使用。

每次查詢完數(shù)據(jù)庫是都要使用release()方法釋放數(shù)據(jù)庫連接,這樣數(shù)據(jù)庫連接又回到了連接池中。釋放后如果再使用connection將會報錯。

關閉連接池

一般數(shù)據(jù)庫連接池不需要關閉,但是如果使用完連接池需要將所有的連接關閉,我們可以使用pool.end()方法將其關閉。

pool.end(function (err) {
 // 所有連接池中的數(shù)據(jù)庫連接將會被關閉
});

end()方法提供一個回調(diào)方法,以便在所有連接關閉時進行一些操作。關閉連接池前所有隊列中的查詢?nèi)稳粫?zhí)行完成,所以每次關閉的時間都不一樣。一旦end()方法被調(diào)用了,getConnection和其他一些獲取連接池中連接的方法不會再被執(zhí)行。

總結(jié)

本篇文章主要學習了nodejs連接mysql數(shù)據(jù)庫的一些兩種連接方式,直接連接和通過數(shù)據(jù)庫連接池的方式進行連接。直接創(chuàng)建連接的方式比較“危險”,推薦使用連接池,把所有的連接集中管理,既方便又安全。

相關文章

  • nodejs acl的用戶權(quán)限管理詳解

    nodejs acl的用戶權(quán)限管理詳解

    這篇文章主要介紹了nodejs acl的用戶權(quán)限管理詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Node.js中的流(Stream)介紹

    Node.js中的流(Stream)介紹

    這篇文章主要介紹了Node.js中的流(Stream)介紹,本文講解了什么是流、pipe方法、流的分類、Readable流狀態(tài)的切換等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • node.js中的path.sep方法使用說明

    node.js中的path.sep方法使用說明

    這篇文章主要介紹了node.js中的path.sep方法使用說明,本文介紹了path.sep的方法說明、語法、使用實例,需要的朋友可以參考下
    2014-12-12
  • 教你如何使用node.js制作代理服務器

    教你如何使用node.js制作代理服務器

    本文介紹了如何使用node.js制作代理服務器,圖文并茂,十分的詳細,代碼很簡潔易懂,這里推薦給大家。
    2014-11-11
  • Nodejs實現(xiàn)爬蟲抓取數(shù)據(jù)實例解析

    Nodejs實現(xiàn)爬蟲抓取數(shù)據(jù)實例解析

    這篇文章主要介紹了Nodejs實現(xiàn)爬蟲抓取數(shù)據(jù)實例解析,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • 如何刪除node_modules重新安裝的方法步驟

    如何刪除node_modules重新安裝的方法步驟

    我們在開發(fā)項目的時候,每次安裝的 node 包會出現(xiàn)版本和項目所需要的版本不一致的問題,那么如何刪除node_modules重新安裝,本文就詳細的介紹一下
    2021-09-09
  • node基于puppeteer模擬登錄抓取頁面的實現(xiàn)

    node基于puppeteer模擬登錄抓取頁面的實現(xiàn)

    本篇文章主要介紹了node基于puppeteer模擬登錄抓取頁面的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • node.js實現(xiàn)pdf與圖片互轉(zhuǎn)代碼示例

    node.js實現(xiàn)pdf與圖片互轉(zhuǎn)代碼示例

    因工作需求,記錄一次如何在Node中pdf與圖片互轉(zhuǎn)各種操作,這篇文章主要給大家介紹了關于node.js實現(xiàn)pdf與圖片互轉(zhuǎn)的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • node.js基于express使用websocket的方法

    node.js基于express使用websocket的方法

    這篇文章主要介紹了node.js基于express使用websocket的方法,結(jié)合實例形式分析了node.js基于express調(diào)用websocket相關設置與使用操作技巧,需要的朋友可以參考下
    2017-11-11
  • Node.js連接postgreSQL并進行數(shù)據(jù)操作

    Node.js連接postgreSQL并進行數(shù)據(jù)操作

    自從MySQL被Oracle收購以后,PostgreSQL逐漸成為開源關系型數(shù)據(jù)庫的首選。這篇文章就給大家介紹了關于Node.js如何連接postgreSQL數(shù)據(jù)庫,并進行數(shù)據(jù)操作的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12

最新評論