您好,登錄后才能下訂單哦!
Node.js中怎么連接MySQL數據庫,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
什么是關系型數據庫和非關系型數據庫
說到關系型數據庫,大家肯定就會想到另一個詞與之對應,非關系型數據庫,那么這兩者有什么樣的區別呢?
關系型數據庫是指采用了關系模型(指的是二維表格模型)來組織數據的數據庫,有穩定的表結構;而非關系型數據庫中的數據沒有關系模型,以對象的形式存放到數據庫中,對象之間的關系是通過每個對象的屬性來決定的,有點類似于一長串json對象。典型的非關系型數據庫有MongoDB和Redis。
MySQL的優缺點
我在項目中使用MySQL作為數據庫主要是因為它體積小,速度快,安裝完才幾百兆,相比于Oracle好幾個G它確實“輕”了不少。而且核心程序采用多線程編程,線程也是輕量級的進程,不會占用太多的系統資源,因此一般的中小型網站都選擇MySQL數據庫,而且最重要的是MySQL幾乎是免費的。
但是也正是由于它的輕量級,因此它也“砍掉”了一些功能,比如存儲過程等。
使用
這邊不再贅述MySQL的安裝過程,有需要的讀者可以自行百度安裝教程。在我們的項目中通過npm install mysql --save
來安裝依賴。
一個簡單的Demo
首先,通過一個小的Demo來測試我們的環境是否已經搭建完畢了:
var mysql = require('mysql'); // 連接數據庫的配置 var connection = mysql.createConnection({ // 主機名稱,一般是本機 host: 'localhost', // 數據庫的端口號,如果不設置,默認是3306 port: 3306 // 創建數據庫時設置用戶名 user: 'xyf', // 創建數據庫時設置的密碼 password: 'xyf', // 創建的數據庫 database: 'xyf_db' }); // 與數據庫建立連接 connection.connect(); // 查詢數據庫 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”,那么整個連接查詢是成功的;如果不成功,讀者可以根據打印的錯誤信息提示來修改。
在查詢完數據庫后,需要通過end()
函數將連接關閉。如果連接一直打開,首先會浪費不必要的系統資源;其次,數據庫的連接數量有限制,如果達到上限時,會出現后續連接不上報錯的情況。
建立數據庫連接
要想查詢數據庫,首先就要跟數據庫建立連接,上面的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()
函數建立連接,而且直接進行了查詢,這時候建立連接將會被隱式地調用。
連接回調查詢
上面兩種連接方式并沒有對連接出錯的情況進行處理,一旦連接出現錯誤將帶來連鎖的多米諾骨牌效應,查詢也將會失敗,整個程序也會崩潰,為了避免出現這樣的情況,我們將查詢和關閉連接放到回調函數中。
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(); });
注:上面的三種建立連接的方式都是可以的,取決于筆者怎么處理連接錯誤。
關閉連接
打開了數據庫的連接我們也需要關閉連接,有兩種關閉連接的方式,一種就是我們上面用的end()
方法來關閉連接,它可以接收一個回調函數。
connection.end(function(err) { // 這時連接已經被關閉了 });
通過end()函數關閉連接不會影響隊列中的查詢。還有一種方式是調用destroy()
函數。
connection.destroy();
destroy()
函數確保了沒有更多的時間和回調會觸發連接。同時destroy()
函數也沒有回調函數。
使用數據庫連接池
數據庫連接是一種關鍵的、有限的、昂貴的資源。 —百度百科
通過上面的數據庫連接方式我們會發現直接創建一個數據庫連接比較“危險”,因為有很多種可能性導致連接的失敗。而且如果我們的程序中隨意都可以和數據庫建立連接的話,我們的程序就比較得混亂,不能很有效的管理數據庫連接。mysql庫提供了另一種數據庫連接方式給我們。
什么是數據庫連接池
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個。這項技術能明顯提高對數據庫操作的性能。
用一個很生動的例子來形容數據庫連接池的工作:以前我們存取錢都需要去銀行的柜臺交易,銀行的柜臺數量是有限的,人多的時候還需要排隊;現在我們把錢都存在了支付寶上,每次需要用錢的時候都直接跟支付寶“要”,不需要再跑到銀行去了,所有和銀行“打交道”的業務都交給了支付寶幫我們來管理。
數據庫連接池在初始化的時候將一定數量(數量受最小連接數制約)的數據庫連接存放到數據庫連接池中,不管這些數據庫連接是否被使用,連接池一直要存放這么多的連接數量。連接池的最大數據庫連接數量限制了連接池最多能同時擁有的連接數,如果超過最大連接數時,請求將會被添加到等待隊列中去。
創建連接池
下面就開始創建一個數據庫連接池。
var mysql = require('mysql'); var pool=mysql.createPool({ host: 'localhost', user: 'xyf', password: 'xyf', port: '3306', database: 'xyf_db', // 最大連接數,默認為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()
方法創建了一個數據庫連接池,它的配置參數和上面的配置基本差不多,只是多了一個最大連接數。每次我們需要和數據庫建立連接的時候不再是直接建立連接,而是去連接池中通過pool.getConnection()
方法“撈取”已有的連接。這個方法有一個回調,數據庫連接作為回調參數返回給我們使用。
每次查詢完數據庫是都要使用release()
方法釋放數據庫連接,這樣數據庫連接又回到了連接池中。釋放后如果再使用connection將會報錯。
關閉連接池
一般數據庫連接池不需要關閉,但是如果使用完連接池需要將所有的連接關閉,我們可以使用pool.end()
方法將其關閉。
pool.end(function (err) { // 所有連接池中的數據庫連接將會被關閉 });
end()
方法提供一個回調方法,以便在所有連接關閉時進行一些操作。關閉連接池前所有隊列中的查詢任然會執行完成,所以每次關閉的時間都不一樣。一旦end()方法被調用了,getConnection和其他一些獲取連接池中連接的方法不會再被執行。
關于Node.js中怎么連接MySQL數據庫問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。