Node.js如何实现MySQL数据库连接池
作者:橘猫吃不胖~
什么是数据库连接池
数据库连接池是程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池,由程序动态地对池中的连接对象进行申请、使用和释放。
原理及优点
数据库连接池在初始化时将会创建一定数量的数据库连接对象放到连接池中,连接池都将一直保证至少拥有这么多的连接数量,当有数据库需要被连接的时候,它会向数据库连接池申请资源和使用,使用完成后会释放到数据库连接池中。当然数据库连接池中拥有最小连接数量和最大连接数量,当数据库的连接超过连接池中最大的数量的时候,这些请求将被加入到等待队列中。
用服装店招聘导购来说明数据库连接池。当只有顾客A时,服装店招聘一个导购A,如果之后顾客B、C、D、E、F…也来了,那么就需要不断招聘导购B、C、D、E、F…,这样会带来大量的人力成本。
如果让一个主管去管理一定数量(以5为例)的导购,当顾客A、B、C、D、E来了,主管依次分配了导购A、B、C、D、E,但如果顾客F来了,由于已经没有空闲的导购了,因此顾客F需要排队等待。
等A、B、C、D、E导购其中任何一个服务完成后(比如说导购D),他又重新回到了导购组中,这时主管会将他分配给顾客F。
数据库的链接池也是这个意思,当网站某一天有很大的流量的时候,数据库服务器需要为每次链接创建一次数据库链接。
这样就很浪费数据库的资源,并且频繁的创建和关闭数据库的链接,很容易导致服务器内存溢出等情况发生。
连接池的作用
数据库的连接池负责分配、管理和释放数据库连接对象的。
它允许应用程序重复使用一个现有的数据库的连接对象。而不是重新创建一个。
实现连接池
1.导入mysql模块
首先安装mysql模块:
npm install mysql
导入mysql模块:
const mysql = require("mysql");
2.创建数据库连接池
创建数据库连接池语法如下:
const pool = mysql.createPool({ host: "数据库服务器地址", port: 3306, // MySQL数据库端口号 database: "数据库名", user: "连接数据库的用户名", password: "连接数据库的密码", connectionLimit: "指定连接池中最大的链接数,默认是10", queueLimit: "指定允许挂起的最大连接数,如果挂起的连接数超过该数值,就会立刻抛出错误,默认属性值为0,代表不允许被挂起的最大连接数", multipleStatements: "是否运行执行多条sql语句,默认值为false" })
示例:创建数据库连接池
const mysql = require("mysql"); const pool = mysql.createPool({ host: "127.0.0.1", // 主机地址 port: 3306, database: "info", // 数据库名字 user: "root", // 连接数据库的用户名 password: "123456", // 连接数据库密码 connectionLimit: 20, // 连接池最大连接数 multipleStatements: true // 允许执行多条sql语句 }) module.exports = pool;
3.从连接池中获取一个连接
语法:
pool.getConnection(function (err, connection) { // 代码 });
err
:该参数是指操作失败时的错误对象。connection
:该值为一个对象,代表获取到的连接对象。当连接失败时,该值为undefined。
4.释放连接对象(放回连接池)
connection.release();
5.从连接池中移除连接对象
connection.destory();
6.关闭该连接池
pool.end();
案例
使用连接池连接MySQL数据库,查询info数据库中stu表中的所有信息,
stu表具体如下:
创建mydb.js,创建数据库连接池,代码如下:
const mysql = require("mysql"); // 创建数据库连接池 const pool = mysql.createPool({ host: "localhost", port: 3306, user: "root", password: "123456", database: "info", connectionLimit: 20, }); // 将数据库连接池对象导出 module.exports = pool;
创建test.js文件,使用连接池查询数据库,代码如下:
const express = require("express"); // 导入express const app = express(); // 创建实例 const pool = require("./mydb"); // 导入连接池 // http://localhost:3000/test app.get("/test", ((req, res) => { // 从连接池中获取数据库的连接对象 pool.getConnection(function (err, conn) { if (err) { console.log("数据库连接失败"); } else { console.log("数据库连接成功"); // 定义sql查询语句 let sql = "select * from stu"; // 查询操作 conn.query(sql, function (err, result) { if (err) { console.log("数据库查询失败"); } else { res.send(result); conn.release(); } }) } }) })) // 监听3000端口 app.listen(3000);
启动服务器,在浏览器中打开http://localhost:3000/test,会看到成功查询到了表stu中的数据。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。