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,你是说部分答案是粗鲁的吗?你能详细说明一下哪个部分吗?我会修正的。我发现你多重复两次“它使用光标”的部分是粗鲁的,听起来很讽刺。你把强调误认为粗鲁/讽刺;但我调整了答案。