Node.js数据库操作之连接MySQL数据库(一)

发布时间 - 2026-01-10 23:26:13    点击率:

介绍

首先说来介绍一下MySQL(非广告)。MySQL是由瑞典的MySQL AB公司开发,后来被甲骨文公司收购。和Oracle一样,MySQL是一个典型的关系型数据库,在百度百科中,把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和其他一些获取连接池中连接的方法不会再被执行。

总结

本篇文章主要学习了nodejs连接mysql数据库的一些两种连接方式,直接连接和通过数据库连接池的方式进行连接。直接创建连接的方式比较“危险”,推荐使用连接池,把所有的连接集中管理,既方便又安全。


# nodejs  # mysql数据库  # node连接mysql数据库  # nodejs与mysql数据库  # 初步使用Node连接Mysql数据库  # nodejs连接mysql数据库简单封装示例-mysql模块  # nodejs连接mysql数据库及基本知识点详解  # Node.js使用MySQL连接池的方法实例  # Node连接mysql数据库方法介绍  # 使用nodejs连接mySQL写接口全过程(增删改查)  # 连接池  # 回调  # 将会  # 池中  # 连接数  # 两种  # 支付宝  # 出了  # 给我们  # 报错  # 数据库中  # 创建一个  # 都是  # 是一个  # 就会  # 瑞典  # 是一种  # 我在  # 太多  # 都不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  详解jQuery中基本的动画方法  JavaScript常见的五种数组去重的方式  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  米侠浏览器网页背景异常怎么办 米侠显示修复  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  如何基于云服务器快速搭建个人网站?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Thinkphp 中 distinct 的用法解析  如何实现建站之星域名转发设置?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  Laravel如何升级到最新版本?(升级指南和步骤)  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  深入理解Android中的xmlns:tools属性  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Laravel怎么调用外部API_Laravel Http Client客户端使用  魔方云NAT建站如何实现端口转发?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  如何在香港免费服务器上快速搭建网站?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Python文本处理实践_日志清洗解析【指导】  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel如何实现API资源集合?(Resource Collection教程)  PythonWeb开发入门教程_Flask快速构建Web应用  5种Android数据存储方式汇总  如何用西部建站助手快速创建专业网站?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  制作企业网站建设方案,怎样建设一个公司网站?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址