From de9d6531ecc270665f37df3783c7d6f1670d6a18 Mon Sep 17 00:00:00 2001 From: sophia parafina Date: Mon, 12 Dec 2016 15:37:28 -0600 Subject: [PATCH] added connection pooling to postgres to prevent client timeouts --- result/package.json | 1 + result/server.js | 35 ++++++++++++++--------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/result/package.json b/result/package.json index f7863e1..0f208ca 100644 --- a/result/package.json +++ b/result/package.json @@ -15,6 +15,7 @@ "method-override": "^2.3.5", "async": "^1.5.0", "pg": "^4.4.3", + "pg-pool": "1.6.0", "socket.io": "^1.3.7" } } diff --git a/result/server.js b/result/server.js index 0d0c60c..8214b69 100644 --- a/result/server.js +++ b/result/server.js @@ -1,13 +1,25 @@ var express = require('express'), async = require('async'), pg = require("pg"), + Pool = require("pg-pool"), cookieParser = require('cookie-parser'), - bodyParser = require('body-parser'), + bodyParser = require('body-parser'), methodOverride = require('method-override'), app = express(), server = require('http').Server(app), io = require('socket.io')(server); +var config = { + host: 'localhost', + user: 'postgres', + password: '', + database: 'postgres', + max: 10, // max number of clients in pool + idleTimeoutMillis: 1000, // close & remove clients which have been idle > 1 second +}; + +var client = new Pool(config) + io.set('transports', ['polling']); var port = process.env.PORT || 4000; @@ -23,14 +35,6 @@ io.sockets.on('connection', function (socket) { async.retry( {times: 1000, interval: 1000}, - function(callback) { - pg.connect('postgres://postgres@db/postgres', function(err, client, done) { - if (err) { - console.error("Waiting for db"); - } - callback(err, client); - }); - }, function(err, client) { if (err) { return console.err("Giving up"); @@ -45,24 +49,13 @@ function getVotes(client) { if (err) { console.error("Error performing query: " + err); } else { - var votes = collectVotesFromResult(result); + var votes = result.rows[0].count io.sockets.emit("scores", JSON.stringify(votes)); } - setTimeout(function() {getVotes(client) }, 1000); }); } -function collectVotesFromResult(result) { - var votes = {a: 0, b: 0}; - - result.rows.forEach(function (row) { - votes[row.vote] = parseInt(row.count); - }); - - return votes; -} - app.use(cookieParser()); app.use(bodyParser()); app.use(methodOverride('X-HTTP-Method-Override'));