Fer*_*sso 3 postgresql node.js
我有这段代码:
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');
});
Run Code Online (Sandbox Code Playgroud)
当我在上面运行apache bench时,每秒只能收到大约四个请求。如果我在php / apache或java / tomcat中运行相同的查询,我得到的结果快十倍。该数据库有1000行。如果我将查询限制为大约十行,那么node比php / java快一倍。
我究竟做错了什么?
编辑:前段时间我在这里打开了一个问题:https : //github.com/brianc/node-postgres/issues/653
我之所以提供此链接,是因为我在此处尝试过的代码上发布了一些其他变体。到目前为止,即使有评论和提示,我也无法获得下降的速度。
pg-query-stream 使用游标。batchSize以更好地满足您的需求。对于那些不知道游标是什么的人,简而言之,它们是权衡的选择,以保持较小的内存占用并且不读取内存中的整个表。但是,如果在获得结果100的同时获得行1000,那就是1000 / 100往返。因此可能10x比不使用游标的解决方案要慢。
如果知道需要多少行,limit请在查询中添加,然后更改每次返回的行数,以最大程度地减少往返次数。