0

Ich habe in ein seltsames Problem geraten, das ich nicht richtig scheinen kann.Node.js pg Pool langsam auf zweite Ausführung

Ich benutze Pg Pooling in einer Node.js App und es läuft sehr schnell auf die erste Ausführung und dann auf der zweiten ist es dramatisch langsamer (30/50s).

Ich habe durch die Dokumentation auf der Seite GitHub lesen https://github.com/brianc/node-postgres/wiki/Example

, die die Verwendung einer globalen Variablen zu erstellen, um nicht mehrere Pools zu erfordern scheint, die ich versucht habe, wie folgt zu tun.

Ich habe meine Haupt-Server-Datei unten

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); 

}); 

, die eine Route Datei verwendet, die die Datenbankabfrage funktioniert

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; 

Wenn ich eine GET-Anfrage zu dieser Strecke machen es wirklich schnell einmal ausführt die Taste wird gedrückt, aber jedes Mal, wenn sie danach gedrückt wird, wird es schrecklich langsam.

Fehle ich etwas im Code? Gibt es einen zusätzlichen Schritt, um mehrere Anfragen zu bearbeiten?

+2

In der Vergangenheit habe ich ähnliche Probleme hatte, bekam ich verrückt mit dieser Bibliothek (node-Postgres). Dann entdecke ich [pg-promise] [1], das alles für Sie erledigt und auf Versprechen basiert. Mein Leben hat sich verändert. [1]: http://github.com/vitaly-t/pg-promise –

+0

Es klingt wirklich nett, ich werde es auf jeden Fall einen Blick darauf werfen – Trent

+2

@Trent Umzug in [pg-Versprechen] (https://github.com/vitaly-t/pg-promise) wird Sie von all den Kopfschmerzen mit Verbindungspools und deren Verwaltung befreien. –

Antwort

1

alert() existiert nicht im Knoten. Wenn Sie eine HTTP-Anfrage annehmen, sollten Sie auch eine Antwort zurücksenden. Wenn Sie nur eine Abfrage ausführen möchten, können Sie pool.query() verwenden.

Alle zusammen:

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); 
    }); 
}); 

Und mit 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); 
    }); 
    }); 
}); 
+0

Hallo @robertklep, Ich benutze Node-Webpack, weshalb ich Warnungen verwende. Ich weiß auch nicht warum, aber sobald ich das res.send (result.rows) Bit am Ende hinzugefügt habe, hat es gut funktioniert, nicht 100% sicher, warum es behoben wurde – Trent

+1

@Trent 'alert()' ist Client (Browser-) Code, aber Ihr Code soll serverseitig (Node) ausgeführt werden. – robertklep

+0

Ich benutze nur eine Warnung zum Debuggen, ich entferne es, sobald die Fehler behoben sind – Trent

Verwandte Themen