我正在为NodeJS与Java进行快速性能测试.选择的简单用例是查询MySQL数据库中的单个表.初步结果如下:
Platform | DB Connections | CPU Usage | Memory Usage | Requests/second
==============================|================|===========|===============|================
Node 0.10/MySQL | 20 | 34% | 57M | 1295
JBoss EAP 6.2/JPA | 20 | 100% | 525M | 4622
Spring 3.2.6/JDBC/Tomcat 7.0 | 20 | 100% | 860M | 4275
Run Code Online (Sandbox Code Playgroud)
请注意,Node的CPU和内存使用率低于Java,但吞吐量也大约为三分之一!然后我意识到Java在我的CPU上使用了所有四个核心,而Node只在一个核心上运行.所以我改变了Node代码以合并集群模块,现在它正在使用所有四个核心.以下是新结果:
Platform | DB Connections | CPU Usage | Memory Usage | Requests/second
==============================|================|===========|===============|================
Node 0.10/MySQL (quad core) | 20 (5 x 4) | 100% | 228M (57 x 4) | 2213
Run Code Online (Sandbox Code Playgroud)
请注意,CPU和内存使用量现已成比例增加,但吞吐量仅增加了70%.我期待增加四倍,超过Java吞吐量.我如何解释这种不足?我该怎么做才能线性增加吞吐量?
这是使用多个核心的代码: …
我有以下代码.
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'test'
});
connection.connect();
var userdata = '24';
var sql = 'SELECT COUNT(*) FROM names WHERE age = ?'
connection.query(sql, [userdata], function(err, rows, fields) {
if (err) throw err;
console.log('Query result: ', rows);
});
connection.end();
Run Code Online (Sandbox Code Playgroud)
我想获取表'name'中记录的总数,其中'age'= 24.我在node.js命令提示符下收到以下内容.
Query result: [ { 'COUNT(*)': '14' } ]
Run Code Online (Sandbox Code Playgroud)
我的问题是如何将这个数字14存储在变量中以供进一步使用.
我知道我可以通过将'sql'行改为来做到这一点
var sql = 'SELECT * FROM names WHERE age = ?'
Run Code Online (Sandbox Code Playgroud)
然后控制台线到
console.log('Query result: …Run Code Online (Sandbox Code Playgroud) 该文档声明您可以直接使用池:
pool.query();
Run Code Online (Sandbox Code Playgroud)
或手动获取连接,然后运行查询:
pool.getConnection(function(err, connection) {
// Use the connection
connection.query( 'SELECT something FROM sometable', function(err, rows) {
// And done with the connection.
connection.release();
// Don't use the connection here, it has been returned to the pool.
});
});
Run Code Online (Sandbox Code Playgroud)
第二个选项是每次需要运行查询时都必须重复的许多代码.直接使用游泳池是否安全?完成后,是否pool.query()将连接释放回池中?
我已经阅读了几个在node.js中使用mysql的例子,我对错误处理有疑问.
大多数示例都像这样进行错误处理(可能为了简洁起见):
app.get('/countries', function(req, res) {
pool.createConnection(function(err, connection) {
if (err) { throw err; }
connection.query(sql, function(err, results) {
if (err) { throw err; }
connection.release();
// do something with results
});
});
});
Run Code Online (Sandbox Code Playgroud)
这会导致服务器每次出现sql错误时崩溃.我想避免这种情况并保持服务器运行.
我的代码是这样的:
app.get('/countries', function(req, res) {
pool.createConnection(function(err, connection) {
if (err) {
console.log(err);
res.send({ success: false, message: 'database error', error: err });
return;
}
connection.on('error', function(err) {
console.log(err);
res.send({ success: false, message: 'database error', error: err });
return;
});
connection.query(sql, function(err, results) {
if (err) { …Run Code Online (Sandbox Code Playgroud) 如何检查mysql(node.js)中是否找不到匹配项?
mysql.query("select * from table1 where name = 'abcd'", function(error, result, field) {
if(error) {
exist(error); //No error
} else if(result) {
console.log(result); //displays '[]'
exist(null, result);
} else {
exist(null, null); //It is never execute
}
});
function exist(error, result) {
if(result)
console.log("Test:"+result); //Executed and displays 'Test:'
}
Run Code Online (Sandbox Code Playgroud)
我的数据库不包含name ='abcd'.那么,我该如何检查查询是否不匹配?
我想用实验室测试hapi路由,我正在使用mysql数据库.
使用Server.inject测试路由的问题是我无法模拟数据库因为我没有调用包含处理函数的文件,所以如何在处理程序中注入模拟数据库?
我正在尝试使用Node.js插入一些数据.我用npm安装了mysql支持.我只是检查了一些源代码,我写了下面的代码,我可以在console.log中跟随sql输出,SQL输出是正确的.但它不会影响mySQL数据库中的任何行.
这是我的代码:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'cccc.net',
user : 'username',
password : 'password',
});
var post = {srcUserID: userSrcID, destUserID: msg.userid, messageContent: msg.txt, messageSendDate:sendDate };
connection.query('INSERT INTO messages VALUES ?', post, function(err, result) {
});
Run Code Online (Sandbox Code Playgroud) 我正在运行一个通过node-mysql模块连接MySQL的Node服务器.连接和查询MySQL最初运行良好,没有任何错误,但是,在节点服务器空闲几小时后的第一个查询会导致错误.错误是熟悉的read ECONNRESET,来自node-mysql模块的深度.
堆栈跟踪(请注意,跟踪的三个条目属于我的应用程序的错误报告代码):
Error
at exports.Error.utils.createClass.init (D:\home\site\wwwroot\errors.js:180:16)
at new newclass (D:\home\site\wwwroot\utils.js:68:14)
at Query._callback (D:\home\site\wwwroot\db.js:281:21)
at Query.Sequence.end (D:\home\site\wwwroot\node_modules\mysql\lib\protocol\sequences\Sequence.js:78:24)
at Protocol.handleNetworkError (D:\home\site\wwwroot\node_modules\mysql\lib\protocol\Protocol.js:271:14)
at PoolConnection.Connection._handleNetworkError (D:\home\site\wwwroot\node_modules\mysql\lib\Connection.js:269:18)
at Socket.EventEmitter.emit (events.js:95:17)
at net.js:441:14
at process._tickCallback (node.js:415:13)
Run Code Online (Sandbox Code Playgroud)
我的云节点服务器和MySQL服务器以及两者的本地设置都会发生此错误.
我的问题:
这个问题是否是由于连接生命周期限制导致Node与MySQL服务器的连接断开?
使用连接池时,node-mysql应该优雅地处理断开连接并从池中删除它们.在我进行查询之前是否不知道断开连接,从而使错误不可避免?
考虑到我在其他StackOverflow帖子中看到了很多"读取ECONNRESET"错误,我应该从MySQL寻找其他地方来诊断问题吗?
更新:经过更多浏览后,我认为我的问题与此问题重复.看起来他的连接也在断开连接,但没有人建议如何保持连接活动或如何解决第一次查询失败之外的错误.
我是node.js的新手并坚持以下内容.任何帮助将不胜感激:
我在ubuntu(12.10)上运行node.js(0.10.28).我正在处理的代码是:
"use strict";
var mysql = require('node-mysql'),
connection = mysql.createConnection({
host: "127.0.0.1",
user: "user",
password: "password",
database: "dbname"
});
if(connection) {
console.log("Query");
connection.query("select * from client",function(err,res) {
if(err)console.log(err);
console.log(res);
});
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Error: Cannot find module 'readable-stream'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/root/RonakNodeEmail/node_modules/node-mysql/lib/protocol/sequences/Query.js:7:20)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
Run Code Online (Sandbox Code Playgroud) 任何人都可以提供一个如何在Node.js中实现MySQL事务的示例.我试图使用node-mysql驱动程序和node-mysql-queue来解决问题.
据我所知,使用node-mysql-queue会大大降低Node.js的异步性质,因为新查询必须等到现有的查询完成.为了解决这个问题,有人试图将node-mysql-queue与node-mysql的连接池功能结合起来.即为每个新的http请求启动一个新的mysql连接,并在各个连接上启动事务队列?
node-mysql ×10
node.js ×10
mysql ×4
connection ×1
econnreset ×1
express ×1
hapijs ×1
java ×1
java-ee ×1
javascript ×1
sequelize.js ×1
spring ×1
transactions ×1