【问题标题】:Node.js pg Pool slow on second executeNode.js pg 池在第二次执行时变慢
【发布时间】:2017-09-15 01:17:36
【问题描述】:

我遇到了一个我似乎无法解决的奇怪问题。

我在 Node.js 应用程序中使用 pg pooling,它在第一次执行时运行得非常快,然后在第二次执行时速度非常慢(30/50 秒)。

我已经阅读了 GitHub 页面上的文档https://github.com/brianc/node-postgres/wiki/Example

这似乎需要使用全局变量才能不创建多个池,我尝试如下操作。

下面有我的主服务器文件

var express = require("express");
var path = require("path");
var app = express();
var port = 3000;

app.use("/public", express.static(process.cwd() + "/public"));

app.set("views", process.cwd() + "/public/views");
app.set("view engine", "ejs");

var login_route = require("./public/logic/login/login_route.js");
app.use(login_route);

app.listen(port, function() {

   var message = "Server Started: Port " + port;
   console.log(message);

});

使用路由文件进行数据库查询

var express = require("express");
var router = express.Router();

var pg = require("pg");

var credentials = {
   host: "127.0.0.1",
   port: "5432",
   database: "altaltalt",
   user: "postgres",
   password: "postgres",
   max: 100,
   idleTimeoutMillis: 30000
};

var pool = new pg.Pool(credentials);

// this bit of code is executed
// when a button is clicked
router.get("/exec", function(req, res) {

   pool.connect (
      function(error, client, done) {

         if(error) {
            console.log("connection failed");
         }

         client.query(

            "select * from dummytable",
             function(error, result) {

               done();

               if(error) {
                  console.log(error);
               }

               alert(result.rows);

             }

         );

      }
   );

});

module.exports = router;

当我向该路由发出 get 请求时,一旦按下按钮,它就会执行得非常快,但之后任何时候按下它都会变得非常缓慢。

我在代码中遗漏了什么吗?是否有额外的步骤来处理多个请求?

【问题讨论】:

  • 过去我也遇到过类似的问题,我疯狂地使用这个库(node-postgres)。然后我发现 [pg-promise][1] 可以为你完成所有关闭客户的工作,并且基于 Promise。我的生活改变了。 [1]:github.com/vitaly-t/pg-promise
  • 听起来很不错,我一定会看看的
  • @Trent 迁移到 pg-promise 将使您摆脱连接池及其管理的所有麻烦。

标签: javascript node.js postgresql connection-pooling node-pg-pool


【解决方案1】:

alert() 在 Node 中不存在。此外,当您接受 HTTP 请求时,您应该发回响应。最后,如果您只想运行一个查询,可以使用pool.query()

大家一起:

router.get('/exec', function(req, res) {
  pool.query('select * from dummytable', function(error, result) {
    if (error) {
      console.log('query failed');
      return res.sendStatus(500);
    }
    res.send(result.rows);
  });
});

并使用pool.connect()

router.get('/exec', function(req, res) {
  pool.connect(function(error, client, done) {
    if (error) {
      console.log('connection failed');
      return res.sendStatus(500);
    }

    client.query('select * from dummytable', function(error, result) {
      done(error);
      if (error) {
        console.log('query failed');
        return res.sendStatus(500);
      }
      res.send(result.rows);
    });
  });
});

【讨论】:

  • 你好@robertklep,我正在使用node-webpack,这就是我使用警报的原因。我也不确定为什么,但是一旦我在最后添加了 res.send(result.rows) 位,它就开始正常工作了,不是 100% 确定为什么会修复它
  • @Trent alert() 是客户端(浏览器)代码,但您的代码旨在运行服务器端(节点)。
  • 我只使用 alert 进行调试,修复错误后将其删除
  • @Trent 你打算让这段代码在浏览器中运行吗?
  • @Trent 很公平,如果node-webkit 确实定义了alert(),那么我想它可以使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多