Node.js如何實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)連接池
什么是數(shù)據(jù)庫(kù)連接池
數(shù)據(jù)庫(kù)連接池是程序啟動(dòng)時(shí)建立足夠數(shù)量的數(shù)據(jù)庫(kù)連接對(duì)象,并將這些連接對(duì)象組成一個(gè)池,由程序動(dòng)態(tài)地對(duì)池中的連接對(duì)象進(jìn)行申請(qǐng)、使用和釋放。
原理及優(yōu)點(diǎn)
數(shù)據(jù)庫(kù)連接池在初始化時(shí)將會(huì)創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)連接對(duì)象放到連接池中,連接池都將一直保證至少擁有這么多的連接數(shù)量,當(dāng)有數(shù)據(jù)庫(kù)需要被連接的時(shí)候,它會(huì)向數(shù)據(jù)庫(kù)連接池申請(qǐng)資源和使用,使用完成后會(huì)釋放到數(shù)據(jù)庫(kù)連接池中。當(dāng)然數(shù)據(jù)庫(kù)連接池中擁有最小連接數(shù)量和最大連接數(shù)量,當(dāng)數(shù)據(jù)庫(kù)的連接超過(guò)連接池中最大的數(shù)量的時(shí)候,這些請(qǐng)求將被加入到等待隊(duì)列中。
用服裝店招聘導(dǎo)購(gòu)來(lái)說(shuō)明數(shù)據(jù)庫(kù)連接池。當(dāng)只有顧客A時(shí),服裝店招聘一個(gè)導(dǎo)購(gòu)A,如果之后顧客B、C、D、E、F…也來(lái)了,那么就需要不斷招聘導(dǎo)購(gòu)B、C、D、E、F…,這樣會(huì)帶來(lái)大量的人力成本。
如果讓一個(gè)主管去管理一定數(shù)量(以5為例)的導(dǎo)購(gòu),當(dāng)顧客A、B、C、D、E來(lái)了,主管依次分配了導(dǎo)購(gòu)A、B、C、D、E,但如果顧客F來(lái)了,由于已經(jīng)沒(méi)有空閑的導(dǎo)購(gòu)了,因此顧客F需要排隊(duì)等待。
等A、B、C、D、E導(dǎo)購(gòu)其中任何一個(gè)服務(wù)完成后(比如說(shuō)導(dǎo)購(gòu)D),他又重新回到了導(dǎo)購(gòu)組中,這時(shí)主管會(huì)將他分配給顧客F。
數(shù)據(jù)庫(kù)的鏈接池也是這個(gè)意思,當(dāng)網(wǎng)站某一天有很大的流量的時(shí)候,數(shù)據(jù)庫(kù)服務(wù)器需要為每次鏈接創(chuàng)建一次數(shù)據(jù)庫(kù)鏈接。
這樣就很浪費(fèi)數(shù)據(jù)庫(kù)的資源,并且頻繁的創(chuàng)建和關(guān)閉數(shù)據(jù)庫(kù)的鏈接,很容易導(dǎo)致服務(wù)器內(nèi)存溢出等情況發(fā)生。
連接池的作用
數(shù)據(jù)庫(kù)的連接池負(fù)責(zé)分配、管理和釋放數(shù)據(jù)庫(kù)連接對(duì)象的。
它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)的連接對(duì)象。而不是重新創(chuàng)建一個(gè)。
實(shí)現(xiàn)連接池
1.導(dǎo)入mysql模塊
首先安裝mysql模塊:
npm install mysql
導(dǎo)入mysql模塊:
const mysql = require("mysql");
2.創(chuàng)建數(shù)據(jù)庫(kù)連接池
創(chuàng)建數(shù)據(jù)庫(kù)連接池語(yǔ)法如下:
const pool = mysql.createPool({ host: "數(shù)據(jù)庫(kù)服務(wù)器地址", port: 3306, // MySQL數(shù)據(jù)庫(kù)端口號(hào) database: "數(shù)據(jù)庫(kù)名", user: "連接數(shù)據(jù)庫(kù)的用戶名", password: "連接數(shù)據(jù)庫(kù)的密碼", connectionLimit: "指定連接池中最大的鏈接數(shù),默認(rèn)是10", queueLimit: "指定允許掛起的最大連接數(shù),如果掛起的連接數(shù)超過(guò)該數(shù)值,就會(huì)立刻拋出錯(cuò)誤,默認(rèn)屬性值為0,代表不允許被掛起的最大連接數(shù)", multipleStatements: "是否運(yùn)行執(zhí)行多條sql語(yǔ)句,默認(rèn)值為false" })
示例:創(chuàng)建數(shù)據(jù)庫(kù)連接池
const mysql = require("mysql"); const pool = mysql.createPool({ host: "127.0.0.1", // 主機(jī)地址 port: 3306, database: "info", // 數(shù)據(jù)庫(kù)名字 user: "root", // 連接數(shù)據(jù)庫(kù)的用戶名 password: "123456", // 連接數(shù)據(jù)庫(kù)密碼 connectionLimit: 20, // 連接池最大連接數(shù) multipleStatements: true // 允許執(zhí)行多條sql語(yǔ)句 }) module.exports = pool;
3.從連接池中獲取一個(gè)連接
語(yǔ)法:
pool.getConnection(function (err, connection) { // 代碼 });
err
:該參數(shù)是指操作失敗時(shí)的錯(cuò)誤對(duì)象。connection
:該值為一個(gè)對(duì)象,代表獲取到的連接對(duì)象。當(dāng)連接失敗時(shí),該值為undefined。
4.釋放連接對(duì)象(放回連接池)
connection.release();
5.從連接池中移除連接對(duì)象
connection.destory();
6.關(guān)閉該連接池
pool.end();
案例
使用連接池連接MySQL數(shù)據(jù)庫(kù),查詢info數(shù)據(jù)庫(kù)中stu表中的所有信息,
stu表具體如下:
創(chuàng)建mydb.js,創(chuàng)建數(shù)據(jù)庫(kù)連接池,代碼如下:
const mysql = require("mysql"); // 創(chuàng)建數(shù)據(jù)庫(kù)連接池 const pool = mysql.createPool({ host: "localhost", port: 3306, user: "root", password: "123456", database: "info", connectionLimit: 20, }); // 將數(shù)據(jù)庫(kù)連接池對(duì)象導(dǎo)出 module.exports = pool;
創(chuàng)建test.js文件,使用連接池查詢數(shù)據(jù)庫(kù),代碼如下:
const express = require("express"); // 導(dǎo)入express const app = express(); // 創(chuàng)建實(shí)例 const pool = require("./mydb"); // 導(dǎo)入連接池 // http://localhost:3000/test app.get("/test", ((req, res) => { // 從連接池中獲取數(shù)據(jù)庫(kù)的連接對(duì)象 pool.getConnection(function (err, conn) { if (err) { console.log("數(shù)據(jù)庫(kù)連接失敗"); } else { console.log("數(shù)據(jù)庫(kù)連接成功"); // 定義sql查詢語(yǔ)句 let sql = "select * from stu"; // 查詢操作 conn.query(sql, function (err, result) { if (err) { console.log("數(shù)據(jù)庫(kù)查詢失敗"); } else { res.send(result); conn.release(); } }) } }) })) // 監(jiān)聽(tīng)3000端口 app.listen(3000);
啟動(dòng)服務(wù)器,在瀏覽器中打開(kāi)http://localhost:3000/test,會(huì)看到成功查詢到了表stu中的數(shù)據(jù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Node.js應(yīng)用中使用Redis的方法簡(jiǎn)介
這篇文章主要介紹了在Node.js應(yīng)用中使用Redis的方法,最簡(jiǎn)單的數(shù)據(jù)讀寫操作相關(guān),需要的朋友可以參考下2015-06-06NodeJS使用文件流解決大文件處理的內(nèi)存與時(shí)間效率問(wèn)題
在 NodeJS 中,文件操作是常見(jiàn)的任務(wù)之一,然而,當(dāng)處理大文件時(shí),直接將整個(gè)文件加載到內(nèi)存中可能會(huì)導(dǎo)致內(nèi)存溢出或性能瓶頸,為了解決這一問(wèn)題,NodeJS 提供了文件流(Stream)機(jī)制,本文將詳細(xì)介紹文件流的優(yōu)點(diǎn)、使用方法、應(yīng)用場(chǎng)景,并探討背壓(Backpressure)的概念2025-01-01node.js適合游戲后臺(tái)開(kāi)發(fā)嗎?
這篇文章主要介紹了node.js適合游戲后臺(tái)開(kāi)發(fā)嗎?node.js是不是能代替C++開(kāi)發(fā)游戲后臺(tái)呢?看完本文我想你會(huì)有一定的了解了,需要的朋友可以參考下2014-09-09Mongoose經(jīng)常返回e11000 error的原因分析
這篇文章主要給大家分析了Mongoose經(jīng)常返回e11000 error的原因,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友可以們下面來(lái)一起看看吧。2017-03-03koa2實(shí)現(xiàn)登錄注冊(cè)功能的示例代碼
這篇文章主要介紹了koa2實(shí)現(xiàn)登錄注冊(cè)功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12node腳本實(shí)現(xiàn)自動(dòng)化簽到和抽獎(jiǎng)功能
本文主要介紹了node腳本實(shí)現(xiàn)自動(dòng)化簽到和抽獎(jiǎng)功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01node+express+ejs使用模版引擎做的一個(gè)示例demo
本篇文章主要介紹了node+express+ejs使用模版引擎做的一個(gè)示例demo,具有一定參考價(jià)值,有興趣的小伙伴可以了解一下2017-09-09npm install -g 遇到權(quán)限問(wèn)題解析
這篇文章主要為大家介紹了npm install -g 遇到權(quán)限問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06