Jestem autorem node-postgres. Po pierwsze, przepraszam, że dokumentacja nie wyjaśniła właściwej opcji:to moja wina. Spróbuję to poprawić. Napisałem właśnie teraz Gist, aby to wyjaśnić, ponieważ rozmowa stała się zbyt długa dla Twittera.
Korzystanie z pg.connect
to droga do zrobienia w środowisku internetowym.
Serwer PostgreSQL może obsłużyć tylko 1 zapytanie na raz na połączenie. Oznacza to, że masz 1 globalny new pg.Client()
połączona z Twoim backendem, cała Twoja aplikacja jest wąska w zależności od tego, jak szybko postgrescan odpowiada na zapytania. Dosłownie uporządkuje wszystko, kolejkując każde zapytanie. Tak, jest asynchroniczny, więc to jest w porządku... ale czy nie pomnożyłbyś swojej przepustowości 10-krotnie? Użyj pg.connect
ustaw pg.defaults.poolSize
do czegoś rozsądnego (robimy 25-100, nie jestem jeszcze pewien właściwej liczby).
new pg.Client
jest wtedy, gdy wiesz, co robisz. Kiedy z jakiegoś powodu potrzebujesz jednego długowiecznego klienta lub musisz bardzo dokładnie kontrolować cykl życia. Dobrym tego przykładem jest użycie LISTEN/NOTIFY
. Klient nasłuchujący musi być w pobliżu i podłączony, a nie udostępniany, aby mógł poprawnie obsłużyć NOTIFY
wiadomości. Innym przykładem może być otwieranie pojedynczego klienta w celu zabicia czegoś lub w skryptach wiersza poleceń.
Bardzo pomocną rzeczą jest scentralizowanie całego dostępu do bazy danych w aplikacji w jednym pliku. Nie zaśmiecaj pg.connect
połączeń lub nowych klientów w całym tekście. Miej plik taki jak db.js
wygląda to mniej więcej tak:
module.exports = {
query: function(text, values, cb) {
pg.connect(function(err, client, done) {
client.query(text, values, function(err, result) {
done();
cb(err, result);
})
});
}
}
W ten sposób możesz zmienić swoją implementację z pg.connect
do niestandardowej puli klientów lub czegokolwiek innego i musisz zmieniać rzeczy tylko w jednym miejscu.
Spójrz na moduł node-pg-query, który właśnie to robi.