我的Node.js代码如下所示
CODE1:下面
var http=require('http');
var MySQL = require('mysql');
mysql = MySQL.createConnection(...)
http.createServer(function(req, res){
// the query will take several seconds
mysql.query("SELECT SLEEP(1)", function....)
});
http.listen(...);
Run Code Online (Sandbox Code Playgroud)
问题是当我刷新页面太快时服务器将崩溃.我认为是node-mysql模块的问题,它在队列中处理查询.所以我尝试创建一个连接池.
CODE2:下面
....
var pool = require('generic-pool');
var mp = pool.Pool({
...
create: function(cb){
client = MySQL.createConnection(...);
cb(null, client)
},
max: 10, // up to 10 connection
min: 2,
...
});
....
mp.acquire(function(err, mysql){
// the query will take several seconds
mysql.query("SELECT SLEEP(1)", function....)
mp.release(mysql);
});
....
Run Code Online (Sandbox Code Playgroud)
但问题还存在,为什么?我怎样才能解决这个问题.
编辑:我发出100个并发100个请求,预计10秒.但它需要20秒.为什么?该池最多只支持5个连接吗?
我正在使用node-mysql连接池的驱动程序.
当只有一个查询时,将连接释放回池中很容易:
pool.getConnection(function(err, connection) {
if (err) {
throw err;
}
query = "SELECT * FROM user WHERE id = ?";
connection.query(query, [id], function(err, users) {
connection.release();
if (err) {
throw err;
}
// ...
});
});
Run Code Online (Sandbox Code Playgroud)
如果我需要再次使用该连接怎么办?我不得不release()向下移动几行.但是如果抛出错误会发生什么?连接是否永远不会返回池中?
我是否必须使用一些控制流程库来获得"最终"时刻才能释放它?
有更好的想法吗?
我正在使用node-mysql,node-js和Q promises.
我已使用上面的内容成功更新,删除和插入了单行.以及在我的测试用例场景中的单个语句中插入多行.
但是,我需要在单个查询或for循环中更新具有不同值(批处理模式)的多个行.
有关如何在mysql2中使用预处理语句的信息(应该在node-mysql上进行改进)非常稀疏且没有示例,尽管这应该是自然的选择,同时还有补偿node-js异步性质的承诺.
另外,我已经在各种测试场景中成功使用了defered.makeNodeResolver().
我试图使用where子句和更改条件更新单个查询中的多个行.
当我更新单行时,它正在工作.但是,当我尝试使用单个查询更新多个行时,记录不会更新.
我准备切换到使用for循环执行多个更新,然后聚合结果并将其从服务器发送回客户端,这将是我的第二选择.如果没有太多的性能影响,我不明白为什么不应该这样做.但我没有找到任何这样做的例子.
var values = [
{ users: "tom", id: 101 },
{ users: "george", id: 102 }
];
// var params = [values.users, values.id ];
var sql = 'UPDATE tabletest SET users = ? WHERE id = ?;';
connection.query(sql, [{users: values[0].users}, {id: values[0].id }], defered.makeNodeResolver());
Run Code Online (Sandbox Code Playgroud)
上面显示的代码实际上并没有更新多行.我想我的语法有错误.
但无论如何,在这种特殊情况下,最好的方法是什么?准备好的语句,for循环中的重复查询或存储过程?
由于连接超时,我的node.js应用程序给出了5xx.这是我连接和查询的方式:
var mysql = require('mysql');
var config = {
host: '172.10.1.1',
port: 3306,
user: 'user',
password: 'pwd',
database: 'mydb',
connectionLimit: 15,
queueLimit: 30
}
var poolCluster = mysql.createPool(config);
var queryDB = function(query, cb) {
poolCluster.getConnection(function(err, connection) {
if(err) {
cb(err, null);
}
else {
connection.query(query, function (err, rows) {
connection.release();
cb(err, rows);
});
}
});
};
Run Code Online (Sandbox Code Playgroud)
此外,在另一个备用版本中,禁用连接池,代码如下所示:
queryDB = function(query, cb) {
var connection = mysql.createConnection(config);
connection.query(query, function(err, rows) {
connection.end();
cb(err, rows);
});
};
Run Code Online (Sandbox Code Playgroud)
但这两个设置都给出了错误:在Connection._handleConnectTimeout连接ETIMEDOUT
可以在此处看到与我当前设置类似的项目:https://github.com/hay-wire/NodeBootstrap/blob/master/models/UsersUtils.js …
到目前为止,我使用node-mysql构建了我的应用程序.我只是使用AWS RDS服务建立了一个安全可访问的mysql数据库,并使用mysql命令行客户端成功测试了SSL连接.我有亚马逊的公钥.pem文件.node-mysql似乎没有SSL连接选项的api.
到目前为止,我发现的唯一一个是Node-mysql-libmysqlclient,但是我尝试连接它时遇到错误,关于绑定依赖项为null的事情,所以我不确定我是否应该相信它.建议使用哪个模块/ api?或者,如果你知道我需要在node-mysql中修改什么,我会愿意修改一下,但看起来它正在使用较低级别的套接字连接到MySQL所以我不确定它有多难以获得SSL部分已添加.
我正在使用felixge/node-mysql模块从 node.js 与 MySQL 数据库进行交互。我在一次请求中向数据库插入大量数据时遇到了问题INSERT。
尽管这里描述了如何使用大型 INSERT 查询向数据库添加 500,000 条记录,但我的脚本因数据量更小而失败,并出现以下错误:
{ [Error: write EPIPE] code: 'EPIPE', errno: 'EPIPE', syscall:
'write', fatal: true }
Run Code Online (Sandbox Code Playgroud)
我认为这个错误在某种程度上与mysql-node 的 github Load data infile failed with EPIPE for large files中的问题#359有关,该问题自创建以来的最后 5 个月内尚未分配给某人。
那么保证交付的查询的实际大小是多少?
询问:
select id, event_time from events where event_time > 1395797406712 and event_time < 1398389406712 order by event_time asc。
此查询返回约 25k 行(总大小 500KB)。
当我使用驱动程序在 Node.js 中查询上述查询时node-mysql,执行大约需要 3-4 秒。(我使用console.time和console.timeEnd)
当我直接在 mySql 中查询它时,它说需要大约 200 毫秒。
是什么造成了这种巨大的差异,以及如何改进 Node.js 实现以与直接 Mysql 查询内联?
我想通过 node.js mysql 模块将多行插入到 mysql 中。我拥有的数据是
var data = [{'test':'test1'},{'test':'test2'}];
Run Code Online (Sandbox Code Playgroud)
我正在使用游泳池
pool.getConnection(function(err, connection) {
connection.query('INSERT INTO '+TABLE+' SET ?', data, function(err, result) {
if (err) throw err;
else {
console.log('successfully added to DB');
connection.release();
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
这失败了。
有没有办法让我进行批量插入并在所有插入完成后调用函数?
问候锤子
我有一些类似的数据
var records = [
{Name: '', Id: 1},
{Name: '', Id: 2},
{Name: '', Id: 3},
{Name: '', Id: 4},
{Name: '', Id: 5},
{Name: '', Id: 6}
];
Run Code Online (Sandbox Code Playgroud)
记录数组中可能有数千个项目......
问题1:我们可以创建一个存储过程来接受mysql中的对象数组吗?
问题2:有没有办法用Node JS将这些数据批量插入mysql?
我刚刚将我的节点 api 切换为使用node-mysql。它不断抑制我的错误/堆栈跟踪,使开发和调试成为一场噩梦。例如,我正在编写一个新功能,但出现此错误:
/opt/figo/banking/node_modules/mysql/lib/protocol/Parser.js:78
throw err; // Rethrow non-MySQL errors
^
TypeError: string is not a function
Run Code Online (Sandbox Code Playgroud)
该mysql模块是必不可少的重新措辞我的原始错误消息。我怎样才能让它停止这样做?我只想确切地看到它失败的地方,而不是node-mysql决定重新抛出我的错误的地方。
node-mysql ×10
node.js ×10
mysql ×7
bulkinsert ×2
amazon-rds ×1
angularjs ×1
bulkloader ×1
javascript ×1
performance ×1
promise ×1
ssl ×1