Node.js nodejs+;postgresql太慢了
我有一段代码:Node.js nodejs+;postgresql太慢了,node.js,postgresql,Node.js,Postgresql,我有一段代码: var pg = require('pg'); var QueryStream = require('pg-query-stream'); var constr = 'postgres://devel:1234@127.0.0.1/tcc'; var JSONStream = require('JSONStream'); var http = require('http'); pg.connect(constr, function(err, client, done) {
var pg = require('pg');
var QueryStream = require('pg-query-stream');
var constr = 'postgres://devel:1234@127.0.0.1/tcc';
var JSONStream = require('JSONStream');
var http = require('http');
pg.connect(constr, function(err, client, done) {
if (err) {
console.log('Erro ao conectar cliente.', err);
process.exit(1);
}
sql = 'SELECT \
pessoa.cod, \
pessoa.nome, \
pessoa.nasc, \
cidade.nome AS cidade \
FROM pessoa, cidade \
WHERE cidade.cod IN (1, 2, 3);';
http.createServer(function (req, resp) {
resp.writeHead(200, { 'Content-Type': 'text/html; Charset=UTF-8' });
var query = new QueryStream(sql);
var stream = client.query(query);
//stream.on('data', console.log);
stream.on('end', function() {
//done();
resp.end()
});
stream.pipe(JSONStream.stringify()).pipe(resp);
}).listen(8080, 'localhost');
});
当我在它上面运行apachebench时,它每秒只收到四个请求。
如果我在php/apache或java/tomcat中运行相同的查询,速度会快十倍
结果。数据库有1000行。如果我将查询限制为大约十行,
那么node的速度是php/java的两倍
我做错了什么
编辑:不久前,我在这里打开了一个问题:
我之所以提供这个链接,是因为我在那里发布了一些我尝试过的代码的其他变体。
即使到目前为止有评论和提示,我仍然无法获得下降速度。看起来您正在等待服务器创建,然后请求才会被转发。尝试将http.createServer移动到调用外部。如果您只想在请求中使用http服务器,那么应该尝试使调用异步 也许您应该设置http.agent.maxSockets值,请尝试以下操作:
var http = require('http');
http.agent.maxSockets = {{number}};
默认maxSockets为5
batchSize
,以更好地满足您的需要1000
结果的时候得到100
行,那就是1000/100
往返;因此可能比不使用游标的解决方案慢10倍
如果您知道需要多少行,请在查询中添加一个
限制,并更改每次返回的行数,以最大限度地减少往返次数。根据这段代码,您可以创建一个到PostgreSQL的一对一连接,所有内容都通过它排队
pg
模块允许这样做,如下所述:
如果您想要真正的性能,那么对于每个HTTP请求,您应该从池中获取连接,使用它,释放它,并确保101%始终释放(例如,正确的异常处理),否则一旦池完全耗尽,您的服务器将死亡
一旦到了那里,您就可以调整连接池参数并测量性能。您的所有客户端是否共享到数据库的相同连接?如果是这种情况,您的请求可能会被序列化。我不确定这段代码是否正确地利用了连接池。@Brandon,是的,它们是。我也试过了,但结果差不多。@FernandoBasso,首先,我并没有真正使用任何类型的sql数据库,但从我读到的关于querystream的内容来看,它只在内存中保留少量的行。因此,我认为瓶颈是querystream,您可以尝试在没有querystream的情况下进行测试是的,您应该在没有流的情况下进行基准测试,因为在PHP/apache中,我猜您不会流式处理查询结果。只是出于好奇-您没有加入这两个表。这是故意的吗?nodejs是异步iirc,而且,将http.createServer移到pg.connect
之外会破坏它,因为它使用变量名client
,该变量名是从pg.connect
@freeforalltousez获得的。默认情况下,它是异步的,但调用中的代码需要使用异步包。到目前为止,代码的内容是1)连接到pg,2)查询,3)创建服务器,管道流。在这里,我认为代码的内容是1)连接到pg,2)创建服务器并侦听端口,3)当客户端(浏览器)连接到服务器时查询,管道stream@giladmayani,你是说部分答案是粗鲁的吗?你能详细说明一下哪个部分吗?我会修正的。我发现你多重复两次“它使用光标”的部分是粗鲁的,听起来很讽刺。你把强调误认为粗鲁/讽刺;但我调整了答案。