当前位置:首页 > 日记 > 正文

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

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

介绍

首先说来介绍一下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数据库的一些两种连接方式,直接连接和通过数据库连接池的方式进行连接。直接创建连接的方式比较“危险”,推荐使用连接池,把所有的连接集中管理,既方便又安全。

相关文章

jquery.uploadifive插件怎么解决上

jquery.uploadifive插件怎么解决上

上传,文件大小,插件,电脑软件,jquery,jQuery.uploadifive插件可以很好的解决上传限制图片或文件大小问题,具体方法如下所示:插件是可以用 但遇到问题如何提示是否超过限制呢没办法研究插件js 发现网上给的提示这个插件里竟然没有没有没有.…

excel表格打印缩小放在一张纸的教

excel表格打印缩小放在一张纸的教

缩小,教程,放在,一张纸,表格,  在Excel中录入的数据过多导致一张纸打印不完,但是放到第二张纸又觉得浪费,这个时候就需要我们进行缩小打印,具体该如何设置缩小打印呢?下面是由小编分享的excel表格打印缩小放在一张纸的教程,以供大家阅读和学…

Excel中2010版进行设置顶端标题行

Excel中2010版进行设置顶端标题行

设置,操作技巧,标题,操作步骤,电脑软件,  在excel录入较多的数据时,我们希望每一页都有标题行,这样就可以清楚的知道我们所要表达的意思了。今天,小编就教大家在Excel中2010版进行设置顶端标题行的操作技巧。Excel中2010版进行设置顶端标题…

jQuery实现table中两列CheckBox只

jQuery实现table中两列CheckBox只

示例,电脑软件,table,jQuery,CheckBox,//html<table id="unit"><tr><th>选项一</th><th>选项二</th><th>姓名</th></tr><tr><td><input type="checkbox" /></td><td><input type="checkbox" /></td><td>小红</td></tr><tr><td><input…

微信小程序本作用域下调用全局JS详

微信小程序本作用域下调用全局JS详

作用域,调用,全局,详解,实例,微信小程序本作用域下调用全局JS详解本地wxml文件<view>app版本:{{version}}</view>本地js文件var app;Page({data:{},onLoad:function() {app = getApp();this.setData({version:app.globalData.appName});}})…

ps怎么设计一个加载的动态小图标?

ps怎么设计一个加载的动态小图标?

加载,小图标,动态,电脑软件,ps,在互联网时代,当网络不好时,看到这样的图片,是不是让你万分抓狂。这里教大家用Photoshop软件制作出动态的加载小图标。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、 打…

QQ空间相册批量下载的方法QQ空间相

QQ空间相册批量下载的方法QQ空间相

空间,批量下载,方法,电脑软件,QQ,  QQ空间相册里的照片太多了,一张一张下载比较麻烦,怎么批量下载下来呢?下面小编分享QQ空间相册批量下载的方法,需要的朋友可以参考下.QQ空间相册批量下载的方法1、首先下载一个叫做QQ影像的软件。QQ空间相册…

5种JavaScript脚本加载的方式

5种JavaScript脚本加载的方式

脚本,加载,方式,电脑软件,JavaScript,javaScript文件(下面简称脚本文件)需要被HTML文件引用才能在浏览器中运行。在HTML文件中可以通过不同的方式来引用脚本文件,我们需要关注的是,这些方式的具体实现和这些方式可能会带来的性能问题。当浏览器…

BootStrap框架中的data-[ ]自定义

BootStrap框架中的data-[ ]自定义

自定义属性,推荐,框架,电脑软件,BootStrap,最近几天学习bootstrap有感,通过data-api可以使用所有的bootstrap插件,不用写一行js代码,方便了很多,是我们的首选方式。为什么bootstrap的插件当中出现很多data-api,因为我们通常在使用bootstrap框架…

PPT2007背景怎么设置修改以及更换

PPT2007背景怎么设置修改以及更换

修改,设置,背景,电脑软件,  常常在网上下载了一些PPT模板都不对自己的胃口,想要修改下背景图片,却又不知道从何入手。以下是小编为您带来的关于PPT2007背景设置修改以及更换,希望对您有所帮助。PPT2007背景设置修改以及更换一、PowerPoint中…

ES6新特性一: let和const命令详解

ES6新特性一: let和const命令详解

命令详解,新特性,电脑软件,const,本文实例讲述了ES6新特性中的let和const命令。分享给大家供大家参考,具体如下:1. let 命令① 在js中是没有块级作用域的,var 声明的变量作用域是整个函数体,而let可以起到这一作用{ let a = 1; var b = 2;}co…

PPT怎么转换成视频格式输出PPT转换

PPT怎么转换成视频格式输出PPT转换

格式输出,方法,步骤,转换成,视频,  怎么将PPT输出为视频格式呢?通过将PPT输出为视频格式,可以实现更广泛的观看PPT操作。下面小编来告诉你PPT怎么转换成视频格式输出吧。希望对你有帮助!PPT转换成视频格式输出的步骤要想将PPT转换成视频格…