Node.js,请求,MySQL和连接池是否会导致无限阻塞/冻结行为?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Node.js,请求,MySQL和连接池是否会导致无限阻塞/冻结行为?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2280字,纯文字阅读大概需要4分钟。
内容图文
![Node.js,请求,MySQL和连接池是否会导致无限阻塞/冻结行为?](/upload/InfoBanner/zyjiaocheng/881/adea09a61f004a58841b8fa0c9c4adac.jpg)
我正在研究一种连接到REST服务,获取响应,对其进行转换并将其写入数据库的服务.我最初在概念证明中使用的是平面文件,并且一切正常.现在,在10-15次请求后,脚本将挂起.我得到了处理平面文件的所有30个请求,而数据库上的请求只有三分之一到一半.
我着手编写一个测试案例,以隔离正在发生的事情,并且发现剥离所有实际的应用程序逻辑,数据库模式和请求信息之后,我会得出以下结论:
var mysql = require('mysql');
var pool = mysql.createPool({
host : 'localhost',
user : 'user',
password : 'secret',
});
while (true) {
pool.getConnection(function (err, connection) {
if (err) throw err;
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();
});
});
}
据我所能想象,这是使用连接池完成某件事的最少代码量.运行时,任何内容都不会记录到命令行.删除while {}块,它会按预期运行一次,然后退出.
我的期望是,池大小将提供约束,并且虽然它可以非常快速地查询mysql,但是它永远不会超过一定的大小.相反,它似乎从未尝试建立连接.
根据Daniel关于异步库以及何时调用connection.end()的评论进行编辑.我遵循异步库在这里实现的功能背后的逻辑,即应该尽早释放资源,但是仍然有一些障碍.将查询结果一次打印到控制台,然后“挂起”.
var mysql = require('mysql'),
async = require('async');
var pool = mysql.createPool({
host : 'localhost',
user : 'user',
password : 'secret',
});
async.forever(function() {
pool.getConnection(function (err, connection) {
if(err) throw err;
connection.query('SELECT 1 + 1 AS solution',
function(err, rows, fields) {
connection.end();
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
});
});
},
function (err) {
console.log(err);
});
我不喜欢这样卡住-似乎异步或mysql都违反了异步的承诺…有什么想法吗?
解决方法:
您正在使用同步循环来部署异步资源.你不能那样做.
while循环将填满数据库池,然后再次循环并在getConnection上阻塞,然后阻塞整个Node.js事件循环.
您可以使用异步包执行异步while循环.
async#forever电话将完成您要实现的目标.
另外,您的代码正在泄漏数据库连接.除非您要再次使用相同的连接,否则应将connection.end()首先放在回调中.否则,错误将泄漏数据库连接.
pool.getConnection(function (err, connection) {
if (err) throw err;
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
connection.end(); // return to pool before evaluating error.
if (err) throw err;
console.log('The solution is: ', rows[0].solution);
});
});
内容总结
以上是互联网集市为您收集整理的Node.js,请求,MySQL和连接池是否会导致无限阻塞/冻结行为?全部内容,希望文章能够帮你解决Node.js,请求,MySQL和连接池是否会导致无限阻塞/冻结行为?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。