2013-03-25 12 views
11

Piszę serwer WWW Node.js korzystający z bazy danych Postgres. I służy do podłączenia na każdy nowy wniosek w taki sposób:Jak używać node-postgres na serwerze?

app.get('/', function (req, res) { 
    pg.connect(pgconnstring, function (err, client) { 
    // ... 
    }); 
}); 

Ale po kilku wniosków, zauważyłem „out of memory” błędów na Heroku gdy próbuje się połączyć. Moja baza danych ma tylko 10 wierszy, więc nie rozumiem, jak to się mogło dziać. Wszystkie moje dostępu do bazy danych jest tej postaci:

client.query('SELECT * FROM table', function (err, result) { 
    if (err) { 
    res.send(500, 'database error'); 
    return; 
    } 

    res.set('Content-Type', 'application/json'); 
    res.send(JSON.stringify({ data: result.rows.map(makeJSON) })); 
}); 

Zakładając, że błąd pamięci spowodowany był posiadające kilka stałe połączenia z bazą danych, przeszedłem do stylu widziałem w kilku node-postgres przykładów łączenia tylko raz na top pliku:

var client = new pg.Client(pgconnstring); 
client.connect(); 

app.get('/', function (req, res) { 
    // ... 
}); 

Ale teraz moje prośby powiesić (w nieskończoność?), gdy próbuję wykonać kwerendę po połączenie zostanie przerwane. (Symulowałem go, zabijając serwer Postgres i przywracając go.)

Jak mogę zrobić jeden z nich?

  1. Prawidłowo puli połączeń PostgreSQL tak, że mogę „Reconnect” za każdym razem, bez uruchamiania z pamięci.
  2. Czy klient globalny automatycznie łączy się ponownie po awarii sieci.

Odpowiedz

16

Zakładam, że korzystasz z najnowszej wersji node-postgres, w której znacznie poprawiono łączenie połączeń. Teraz należy sprawdzić połączenie z powrotem do basenu, lub będziesz krwawić połączenia:

app.get('/', function (req, res) { 
    pg.connect(pgconnstring, function (err, client, done) { 
    // do some stuff 
    done(); 
    }); 
}); 

Co do obsługi w połączeniu globalnego błędu (# 2, ale chciałbym korzystać z basenu):

client.on('error', function(e){ 
    client.connect(); // would check the error, etc in a production app 
}); 

"Brakujące dokumenty" dla tego wszystkiego znajdują się na GitHub wiki.

Powiązane problemy