We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
npm install mysql
// 参照官网的simple example var mysql = require('mysql'); var dbConnection = mysql.createConnection({ host: '127.0.0.1', user: 'root', password: 'test', database: 'ua-collector' }); dbConnection.connect(); dbConnection.query('select * from `records`', function(err, rows, fields){ if(!err){ console.log('Results: ', rows); res.render('ua-collector', { title: 'useragent收集器' }); }else{ console.log('Query error occurs: ' + err.stack); } dbConnection.end(); });
如果仅是按着官网的理解来,很容易走进误区,如下:
var express = require('express'); var mysql = require('mysql'); var app = express(); app.listen(3000); var dbConnection = mysql.createConnection({ host: '127.0.0.1', user: 'root', password: 'test', database: 'ua-collector' }); app.get('/', function(req, res, next){ dbConnection.connect(); dbConnection.query('select * from `records`', function(err, rows, fields){ if(!err){ // console.log('Results: ', rows); res.json(rows); }else{ console.log('Query error occurs: ' + err.stack); } dbConnection.end(); }); });
第一次访问首页时一切正常,但是刷新页面第二次进入就会得到如下错误提示:
events.js:85 throw er; // Unhandled 'error' event ^ Error: Cannot enqueue Handshake after invoking quit. at Protocol._validateEnqueue (/Users/benfchen/shinemo/ua-collector/node_modules/mysql/lib/protocol/Protocol.js:196:16) at Protocol._enqueue (/Users/benfchen/shinemo/ua-collector/node_modules/mysql/lib/protocol/Protocol.js:129:13)
其实错误原因是在只通过createConnection创立了一次连接,在第一次首页访问中可以正常查询数据库,但是马上就通过end关闭了连接,导致第二次想要再次连接时就报错了。第二次想要再查询数据库必须再次通过createConnection创立连接才行,也即是如下代码则可以正常运行:
createConnection
end
var express = require('express'); var mysql = require('mysql'); var app = express(); app.listen(3000); app.get('/', function(req, res, next){ var dbConnection = mysql.createConnection({ host: '127.0.0.1', user: 'root', password: 'test', database: 'ua-collector' }); dbConnection.connect(); dbConnection.query('select * from `records`', function(err, rows, fields){ if(!err){ // console.log('Results: ', rows); res.json(rows); }else{ console.log('Query error occurs: ' + err.stack); } dbConnection.end(); }); });
理论上来说上面的代码可以正常运行,但是这里面存在一个巨大的隐患,每次请求都建立一次数据库连接,如果多个用户同时访问那么建立的连接数必定很多,服务器性能如果撑不住就直接挂了。这个取决于服务器性能、数据库皮配置以及并发请求数量是否能够平衡,但是在生产环境中采用这样的代码总不太可靠。
我在我的电脑macbook pro 2015机子上通过siege来做压力测试,并发连接3000没什么问题,但是更多就不清楚了,因为机子分不出更大的内存来模拟并发请求了。
macbook pro 2015
siege
如要通过siege做压力测试,可通过homebrew安装
homebrew
brew install siege // 模拟并发请求3000个 siege -c3000 http://localhost:3000
在生产环境,考虑多用户并发连接问题比较靠谱的是使用连接池来控制数据库的连接访问。
可通过createPool创建一个连接池,并配置好最大的连接数,这样多个连接请求就可以共用一个连接,并有mysql来自动处理请求排队和连接池的管理。
createPool
mysql
var express = require('express'); var mysql = require('mysql'); var app = express(); app.listen(3000); var dbPool = mysql. createPool({ // 创建连接池 connectionLimit : 10, host: '127.0.0.1', user: 'root', password: 'test', database: 'ua-collector' }); app.get('/', function(req, res, next){ dbPool.getConnection(function(err, connection){ // 从连接池中获取连接使用 if(!err){ connection.query('select * from `records`', function(err, rows, fields){ if(!err){ console.log('Results: ' + rows); } connection.release(); // 释放连接 }); } }); });
The text was updated successfully, but these errors were encountered:
No branches or pull requests
安装
简单使用
查询数据库渲染页面
如果仅是按着官网的理解来,很容易走进误区,如下:
第一次访问首页时一切正常,但是刷新页面第二次进入就会得到如下错误提示:
其实错误原因是在只通过
createConnection
创立了一次连接,在第一次首页访问中可以正常查询数据库,但是马上就通过end
关闭了连接,导致第二次想要再次连接时就报错了。第二次想要再查询数据库必须再次通过createConnection
创立连接才行,也即是如下代码则可以正常运行:并发问题
理论上来说上面的代码可以正常运行,但是这里面存在一个巨大的隐患,每次请求都建立一次数据库连接,如果多个用户同时访问那么建立的连接数必定很多,服务器性能如果撑不住就直接挂了。这个取决于服务器性能、数据库皮配置以及并发请求数量是否能够平衡,但是在生产环境中采用这样的代码总不太可靠。
我在我的电脑
macbook pro 2015
机子上通过siege
来做压力测试,并发连接3000没什么问题,但是更多就不清楚了,因为机子分不出更大的内存来模拟并发请求了。如要通过
siege
做压力测试,可通过homebrew
安装连接池
在生产环境,考虑多用户并发连接问题比较靠谱的是使用连接池来控制数据库的连接访问。
可通过
createPool
创建一个连接池,并配置好最大的连接数,这样多个连接请求就可以共用一个连接,并有mysql
来自动处理请求排队和连接池的管理。The text was updated successfully, but these errors were encountered: