nodejs mysql 创建连接池
用Nodejs连接MySQL
从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
关于作者
- 张丹(Conan), 程序员Java,R,PHP,Javascript
- weibo:@Conan_Z
- blog: http://blog.fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/nodejs-mysql-intro/
前言
MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选。查了一下NPM列表,发现Nodejs有13库可以访问MySQL,felixge/node-mysql似乎是最受关注项目,我也决定尝试用一下。
要注意名字,”felixge/node-mysql”非”node-mysql”,安装部分会介绍这个小插曲!
目录
- node-mysql介绍
- 建立MySQL测试库
- node-mysql安装
- node-mysql使用
1. node-mysql介绍
felixge/node-mysql是一个纯nodejs的用javascript实现的一个MySQL客户端程序。felixge/node-mysql封装了Nodejs对MySQL的基本操作,100% MIT公共许可证。
项目地址:https://github.com/felixge/node-mysql
2. 建立MySQL测试库
本地创建MySQL测试库:nodejs
~ mysql -uroot -p mysql> CREATE DATABASE nodejs; mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | nodejs | | performance_schema | +--------------------+ 4 rows in set (0.00 sec) mysql> GRANT ALL ON nodejs.* to nodejs@'%' IDENTIFIED BY 'nodejs'; mysql> GRANT ALL ON nodejs.* to nodejs@localhost IDENTIFIED BY 'nodejs';
重新登陆MySQL
C:\Users\Administrator>mysql -unodejs -p Enter password: ****** mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | nodejs | | test | +--------------------+ 3 rows in set (0.00 sec) mysql> USE nodejs Database changed
新建一个user表
CREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(16) NOT NULL , create_date TIMESTAMP NULL DEFAULT now() )ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE UNIQUE INDEX t_quiz_IDX_0 on t_user(name); mysql> SHOW TABLES; +------------------+ | Tables_in_nodejs | +------------------+ | t_user | +------------------+ 1 row in set (0.04 sec)
3. node-mysql安装
我的系统环境
- win7 64bit
- Nodejs:v0.10.5
- Npm:1.2.19
- MySQL:Server version: 5.6.11 MySQL Community Server (GPL)
创建工程:nodejs-node-mysql
~ D:\workspace\javascript>mkdir nodejs-node-mysql ~ D:\workspace\javascript>cd nodejs-node-mysql ~ D:\workspace\javascript\nodejs-node-mysql>npm install node-mysql node-mysql@0.2.0 node_modules\node-mysql ├── better-js-class@0.1.2 ├── cps@0.1.7 ├── underscore@1.5.2 └── mysql@2.0.0-alpha9 (require-all@0.0.3, bignumber.js@1.0.1)
这里有一个小插曲
安装“node-mysql”后,打开package.json文件发现,这个项目地址是
https://github.com/redblaze/node-mysql.git
从依赖关系可以看到,它依赖于mysql库,是对felixge/node-mysql的封装。
由于这个项目star是0,fork也是0. 所以,我也不准备花时间测试了,重新安装felixge/node-mysql的包。
重新安装node-mysql
~ D:\workspace\javascript\nodejs-node-mysql>rm -rf node_modules ~ D:\workspace\javascript\nodejs-node-mysql>npm install mysql@2.0.0-alpha9 npm http GET https://registry.npmjs.org/mysql/2.0.0-alpha9 npm http 200 https://registry.npmjs.org/mysql/2.0.0-alpha9 npm http GET https://registry.npmjs.org/mysql/-/mysql-2.0.0-alpha9.tgz npm http 200 https://registry.npmjs.org/mysql/-/mysql-2.0.0-alpha9.tgz npm http GET https://registry.npmjs.org/require-all/0.0.3 npm http GET https://registry.npmjs.org/bignumber.js/1.0.1 npm http 304 https://registry.npmjs.org/require-all/0.0.3 npm http 304 https://registry.npmjs.org/bignumber.js/1.0.1 mysql@2.0.0-alpha9 node_modules\mysql ├── require-all@0.0.3 └── bignumber.js@1.0.1
这回就对了,继续下面的开发!
创建node程序启动文件:app.js
第一个测试
~ vi app.js var mysql = require('mysql'); var conn = mysql.createConnection({ host: 'localhost', user: 'nodejs', password: 'nodejs', database:'nodejs', port: 3306 }); conn.connect(); conn.query('SELECT 1 + 1 AS solution', function(err, rows, fields) { if (err) throw err; console.log('The solution is: ', rows[0].solution); }); conn.end();
运行node
~ D:\workspace\javascript\nodejs-node-mysql>node app.js The solution is: 2
这样我们就让Nodejs连接上了MySQL。
4. node-mysql使用
下面我们要对node-mysql的API进行常用的测试。
- 表新删改查
- 连接池配置
- MySQL断线重连
- 连接池超时测试
1). 表新删改查
修改app.js
~ vi app.js var mysql = require('mysql'); var conn = mysql.createConnection({ host: 'localhost', user: 'nodejs', password: 'nodejs', database: 'nodejs', port: 3306 }); conn.connect(); var insertSQL = 'insert into t_user(name) values("conan"),("fens.me")'; var selectSQL = 'select * from t_user limit 10'; var deleteSQL = 'delete from t_user'; var updateSQL = 'update t_user set name="conan update" where name="conan"'; //delete conn.query(deleteSQL, function (err0, res0) { if (err0) console.log(err0); console.log("DELETE Return ==> "); console.log(res0); //insert conn.query(insertSQL, function (err1, res1) { if (err1) console.log(err1); console.log("INSERT Return ==> "); console.log(res1); //query conn.query(selectSQL, function (err2, rows) { if (err2) console.log(err2); console.log("SELECT ==> "); for (var i in rows) { console.log(rows[i]); } //update conn.query(updateSQL, function (err3, res3) { if (err3) console.log(err3); console.log("UPDATE Return ==> "); console.log(res3); //query conn.query(selectSQL, function (err4, rows2) { if (err4) console.log(err4); console.log("SELECT ==> "); for (var i in rows2) { console.log(rows2[i]); } }); }); }); }); }); //conn.end();
控制台输出:
D:\workspace\javascript\nodejs-node-mysql>node app.js DELETE Return ==> { fieldCount: 0, affectedRows: 2, insertId: 0, serverStatus: 34, warningCount: 0, message: '', protocol41: true, changedRows: 0 } INSERT Return ==> { fieldCount: 0, affectedRows: 2, insertId: 33, serverStatus: 2, warningCount: 0, message: '&Records: 2 Duplicates: 0 Warnings: 0', protocol41: true, changedRows: 0 } SELECT ==> { id: 33, name: 'conan', create_date: Wed Sep 11 2013 12:09:15 GMT+0800 (中国标准时间) } { id: 34, name: 'fens.me', create_date: Wed Sep 11 2013 12:09:15 GMT+0800 (中国标准时间) } UPDATE Return ==> { fieldCount: 0, affectedRows: 1, insertId: 0, serverStatus: 2, warningCount: 0, message: '(Rows matched: 1 Changed: 1 Warnings: 0', protocol41: true, changedRows: 1 } SELECT ==> { id: 33, name: 'conan update', create_date: Wed Sep 11 2013 12:09:15 GMT+0800 (中国标准时间) } { id: 34, name: 'fens.me', create_date: Wed Sep 11 2013 12:09:15 GMT+0800 (中国标准时间) }
由于node的异步的,上面是一个连续的操作,代码会被写的支离破碎。我们可以通过async库对上面代码进行封装,请参考文章:Nodejs异步流程控制Async
2). 连接池配置
增加文件:app-pooling.js
~ vi app-pooling.js var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost', user: 'nodejs', password: 'nodejs', database: 'nodejs', port: 3306 }); var selectSQL = 'select * from t_user limit 10'; pool.getConnection(function (err, conn) { if (err) console.log("POOL ==> " + err); conn.query(selectSQL,function(err,rows){ if (err) console.log(err); console.log("SELECT ==> "); for (var i in rows) { console.log(rows[i]); } conn.release(); }); });
控制台输出:
D:\workspace\javascript\nodejs-node-mysql>node app-pooling.js SELECT ==> { id: 39, name: 'conan update', create_date: Wed Sep 11 2013 13:41:18 GMT+0800 (中国标准时间) } { id: 40, name: 'fens.me', create_date: Wed Sep 11 2013 13:41:18 GMT+0800 (中国标准时间) }
3). MySQL断线重连
分别模拟3种错误
- 登陆密码错误
- 数据库宕机
- 数据库连接超时
新增文件:app-reconnect.js
~ vi app-reconnect.js var mysql = require('mysql'); var conn; function handleError () { conn = mysql.createConnection({ host: 'localhost', user: 'nodejs', password: 'nodejs', database: 'nodejs', port: 3306 }); //连接错误,2秒重试 conn.connect(function (err) { if (err) { console.log('error when connecting to db:', err); setTimeout(handleError , 2000); } }); conn.on('error', function (err) { console.log('db error', err); // 如果是连接断开,自动重新连接 if (err.code === 'PROTOCOL_CONNECTION_LOST') { handleError(); } else { throw err; } }); } handleError();
a. 模拟密码错误
修改password: ‘nodejs11′
控制台输出。
D:\workspace\javascript\nodejs-node-mysql>node app-reconnect.js error when connecting to db: { [Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'nodejs'@'localhost' (using pass rd: YES)] code: 'ER_ACCESS_DENIED_ERROR', errno: 1045, sqlState: '28000', fatal: true } error when connecting to db: { [Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'nodejs'@'localhost' (using pass rd: YES)] code: 'ER_ACCESS_DENIED_ERROR', errno: 1045, sqlState: '28000', fatal: true }
b. 模拟数据库宕机
正常启动node,然后杀掉mysqld的进程。
控制台输出。
D:\workspace\javascript\nodejs-node-mysql>node app-reconnect.js db error { [Error: read ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read', fatal: true } Error: read ECONNRESET at errnoException (net.js:884:11) at TCP.onread (net.js:539:19)
这个异常,直接导致node程序被杀死!
c. 模拟连接超时,PROTOCOL_CONNECTION_LOST
切换到root账户, 修改MySQL的wait_timeout参数,设置为10毫秒超时。
~ mysql -uroot -p mysql> show variables like 'wait_timeout'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout | 28800 | +---------------+-------+ 1 row in set (0.00 sec) mysql> set global wait_timeout=10; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'wait_timeout'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout | 10 | +---------------+-------+ 1 row in set (0.00 sec)
修改文件:app-reconnection.js,在最后增加代码
~ vi app-reconnection.js function query(){ console.log(new Date()); var sql = "show variables like 'wait_timeout'"; conn.query(sql, function (err, res) { console.log(res); }); } query(); setInterval(query, 15*1000);
程序会每融15秒,做一次查询。
控制台输出
D:\workspace\javascript\nodejs-node-mysql>node app-reconnect.js Wed Sep 11 2013 15:21:14 GMT+0800 (中国标准时间) [ { Variable_name: 'wait_timeout', Value: '10' } ] db error { [Error: Connection lost: The server closed the connection.] fatal: true, code: 'PROTOCOL_CONNECTION_LOST' } Wed Sep 11 2013 15:21:28 GMT+0800 (中国标准时间) [ { Variable_name: 'wait_timeout', Value: '10' } ] db error { [Error: Connection lost: The server closed the connection.] fatal: true, code: 'PROTOCOL_CONNECTION_LOST' } Wed Sep 11 2013 15:21:43 GMT+0800 (中国标准时间) [ { Variable_name: 'wait_timeout', Value: '10' } ]
我们自己的程序捕获了“PROTOCOL_CONNECTION_LOST”异常,并自动的实现了数据库重连。
4). MySQL连接池的超时测试
针对wait_timeout问题,我们再对连接做一下测试。
修改app-pooling.js文件
var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost', user: 'nodejs', password: 'nodejs', database: 'nodejs', port: 3306 }); var selectSQL ="show variables like 'wait_timeout'"; pool.getConnection(function (err, conn) { if (err) console.log("POOL ==> " + err); function query(){ conn.query(selectSQL, function (err, res) { console.log(new Date()); console.log(res); conn.release(); }); } query(); setInterval(query, 5000); });
控制台输出:
D:\workspace\javascript\nodejs-node-mysql>node app-pooling.js Wed Sep 11 2013 15:32:25 GMT+0800 (中国标准时间) [ { Variable_name: 'wait_timeout', Value: '10' } ] Wed Sep 11 2013 15:32:30 GMT+0800 (中国标准时间) [ { Variable_name: 'wait_timeout', Value: '10' } ] Wed Sep 11 2013 15:32:35 GMT+0800 (中国标准时间) [ { Variable_name: 'wait_timeout', Value: '10' } ]
连接池,已经解决了自动重连的问题了,后面我们的开发,可以尽量使用pooling的方式。
转载请注明出处:
http://blog.fens.me/nodejs-mysql-intro/
This entry was posted in Javascript语言实践, 数据库
站内导航
- 博客系列文章
- 跨界知识聚会系列文章
- AngularJS体验式编程系列文章
- 从零开始nodejs系列文章
- Hadoop家族系列文章
- RHadoop实践系列文章
- 让Hadoop跑在云端系列文章
- R的极客理想系列文章
- R利剑NoSQL系列文章
- MongoDB部署实验系列文章
- 无所不能的Java系列文章
- 自己搭建VPS系列文章
- ubuntu实用工具系列文章
- 高性能测试系列文章
- 用IT技术玩金融系列文章
- 比特币吸金之道系列文章
- 架构师的信仰系列文章
- 算法为王系列文章
- 我的博客我的SEO系列文章
- 创造可视化系列文章
- 创业者的囧境系列文章
- 关于站长
- 友情链接
最新评论
- caimi on R语言天气可视化应用
- Conan Zhang on bower解决js的依赖管理
- Conan Zhang on Browserify 跑在浏览器上的Node程序
- 李舒涵 on RHadoop实践系列之三 R实现MapReduce的协同过滤算法
- maxwheel on bower解决js的依赖管理
- NiKaWaLi on Browserify 跑在浏览器上的Node程序
- NiKaWaLi on Browserify 跑在浏览器上的Node程序
- Conan Zhang on 二条均线打天下
- Conan Zhang on R语言天气可视化应用
- Conan Zhang on R语言天气可视化应用
最新发布
- Node.js进程通信模块child_process
- Node.js缓冲模块Buffer
- Node.js加密算法库Crypto
- Marked高效的Markdown解析器
- Node.js开发框架Express4.x
- 新公司注册流程
- GoAgent代理配置
- 用阿里云配置VPN
- R语言中的遗传算法
- R语言的导数计算
- R语言基于R6的面向对象编程
- R包开发每日中国天气
- R语言天气可视化应用
- R语言3.1版本新特性
- R语言知识体系概览
- 融资融券开户考试
- Nodejs发邮件组件Nodemailer
- CNPM搭建私有的NPM服务
- NPM下载出错 No compatible version found
- 图书出版《R的极客理想-工具篇》
标签云
Dataguru作业Hadoop实践 IT相关知识 Javascript语言实践 JAVA语言实践R语言实践 SEO优化 其他语言 创业 可视化技术 操作系统 数据库 数据挖掘 晒粉丝 架构设计 活动聚会 游戏 程序算法 网络技术 虚拟化实践 金融 面试 黑客攻防
转载于:https://www.cnblogs.com/wxmdevelop/p/4446064.html
nodejs mysql 创建连接池相关推荐
- c mysql 关闭连接池_数据库连接池关闭的时间
上一篇说到分析关闭连接与不关闭连接的性能,到后来我发现自己得出的结论有误.经过多次测试发现关闭连接和不关闭连接耗费的时间基本一样.进哥也说了这是有连接池的原因.其实,自己以前对Ado.net了解的不深 ...
- sqlrelay mysql_php+sqlrelay+mysql实现连接池及读写负载均衡
php+sqlrelay+mysql实现连接池及读写负载均衡 上一篇 / 下一篇 2008-04-02 18:25:19 / 个人分类:MySQL 作者:ziqiu sqlrelay.jpg(20. ...
- mysql odbc连接池_Java Mysql连接池配置和案例分析--超时异常和处理
前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...
- php cli swoole mysql_[了解实践]Swoole、PHP与MySQL:连接池,swoole扩展实现真正的PHP数据库连接池。...
背景:swoole的出现,包括PHP出现前,在新浪企业邮箱就有基于Sun Solaris 系统上面用c++写Mysql的长连接,那时候的长连接是基于RPC实现,对mysql那一端形成一个远程过程的调用 ...
- python调用libs.dbutil_Python 使用 PyMysql、DBUtils 创建连接池,提升性能
Python 编程中可以使用 PyMysql 进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接 MySQL 数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对 ...
- php+sqlrelay+mysql实现连接池及读写负载均衡
本文主要介绍sqlrelay的配置安装.通过其性能和一些具体环境的测试来帮助开发者应用在相应的场合中去应付大并发的mysql数据库连接. 什么是sqlrelay? Sqlrelay是一个开源的数据库连 ...
- mysql api 连接池_SpringBoot-整合HikariCP连接池
HikariCP连接池概述池化思想 池化思想是我们项目开发过程中的一种非常重要的思想,如整数池,字符串池,对象池.连接池.线程池等都是池化思想的一种应用,都是 通过复用对象,以减少因创建和释放对象所带 ...
- tomca7.0 mysql配置连接池_tomcat7.0+mysql连接池配置
1.Tomcat 中直接使用的方法: 在conf/server.xml下的节点里配置resource,例如: auth="Container" type="javax.s ...
- 多线程情况下创建连接池
JAVA数据库连接池实现 博客分类: • 数据库连接池 JAVA数据库连接池连接池原理连接池实现JAVA连接池 连接池的管理用了了享元模式,这里对连接池进行简单设计. 一.设计思路 1.连接池配置属性 ...
最新文章
- 慎重升级!iOS 13可绕过锁屏密码查看通讯录、照片、短信
- 新浪微博RSS Feed实现中的问题
- 图解RadASM使用初步
- 计算机刷帖知识点,09计算机408分(沙滩帖)
- es6 对象中是否有键值_干货| ES6/ES7好玩实用的特性介绍
- [转载] JAVA泛型杂谈--擦除,协变,逆变,通配符等
- js基础——cssText
- 一个华为人辞职创业后的几个反思【转】
- 《JSP实用教程(第2版)/耿祥义》错误之tomcat虚拟服务目录
- HTML5期末大作业:汽车销售网站模板设计(7个页面) HTML+CSS+JavaScript 企业网页设计源码...
- matlab 无法保存.m文件
- 计算机u盘管理软件,电脑U盘管理工具、计算机U盘管理软件、U盘控制软件的使用.doc...
- Python进阶之路(2):批量下载豆瓣FM红心音乐MP3到本地
- 化繁为简,我用”知晓推送”开发微信小程序订阅消息
- iCloud备份失败怎么办?iCloud无法备份解决办法分享!
- MacBook+eGPU编译安装pytorch、tensorflow(OSX10.13.3,python3.6,cuda9.1,cudnn7)(未完成)
- 自动化测试工程师的发展前景怎么样?
- 卫生纸玫瑰花折法5步_折纸玫瑰花最简单的折法 很容易学会的纸玫瑰教程
- 【环境配置】macOS的Xcode中使用C++万能头文件bits/stdc++.h
- 2022年4月23日,第16天
热门文章
- python谷歌网页爬虫_python爬虫入门01:教你在 Chrome 浏览器轻松抓包
- emmap erlang_erlang的map基本使用
- Too many files open; check that FILES = 20 in your CONFIG.SYS file 解决方案
- Visual Tracking:运行ECO模型
- hive udf 分组取top1_项目实战从0到1之hive(27)数仓项目(九)数仓搭建 DWS 层
- 2d绘制 c# dx_C# DX 编程
- python输出日期语句_python输出语句怎么用
- 模版引擎总结之综合分析模版引擎
- [结构型] -- 外观模式
- spring中的监视器,过滤器,拦截器