1. ホーム
  2. javascript

[解決済み] node.jsのpostgresqlモジュールの正しい使い方を教えてください。

2023-01-01 20:44:52

質問

Herokuでnode.jsのアプリを書いています。 pgモジュール . 私は、データベースへのクエリが必要な各リクエストのクライアントオブジェクトを取得するための"right"方法を見つけ出すことができません。

ドキュメントでは、このようなコードを使用しています。

pg.connect(conString, function(err, client) {
  // Use the client to do things here
});

しかし、きっとあなたは pg.connect を呼び出す必要はないのではないでしょうか?私が見たのは 他のコード というのを見たことがあります。

var conString = process.env.DATABASE_URL || "tcp://postgres:1234@localhost/postgres";
var client = new pg.Client(conString);
client.connect();
// client is a global so you can use it anywhere now

Herokuの無料のデータベースインスタンスは、いずれにせよ1つの接続に制限されていると思うので、私は2番目のオプションに傾いていますが、この方法で行うことに何か欠点はありますか?クライアントオブジェクトがまだ接続されているかどうかを使用する前に毎回確認する必要がありますか?

どのように解決するのですか?

私は ノードポストグレス . まず、ドキュメントが正しいオプションを明確にすることに失敗したことをお詫びします:それは私の責任です。 私の責任です。私が書いた a Gist というのは、このことを説明するために、たった今 会話 が長くなりすぎたためです。

<ブロッククオート

使用方法 pg.connect である。 であり、ウェブ環境では

PostgreSQLサーバは、1回の接続で1つのクエリしか処理できません。 つまり、もしあなたが1つのグローバルな new pg.Client() が接続されている場合 バックエンドに接続されたグローバルなが1つある場合、postgresがクエリに応答する速度に基づいて、アプリ全体がボトルネックになります。 がクエリに応答する速度によって、アプリ全体がボトルネックになります。 文字通り、すべてを並べ、それぞれのクエリをキューに入れます。 クエリのキューイングを行います。 非同期だからいいんです。 スループットを10倍にしたほうがいいのでは? 使用方法 pg.connect を設定します。 pg.defaults.poolSize をまともなものに設定します (私たちは 25-100 としました。 を設定します。)

new pg.Client は、自分が何をやっているのか分かっているときのためにあります。 何らかの理由で 何らかの理由で単一の長寿命のクライアントが必要な場合、またはライフサイクルを非常に慎重に制御する必要がある場合です。 ライフサイクルを非常に注意深く制御する必要がある場合です。 この良い例が LISTEN/NOTIFY . リスニングクライアントが必要なのは を適切に扱えるようにするために、共有されていない NOTIFY メッセージを適切に処理できるようにするためです。 他の例としては、1-off クライアントを開いてハングアップしたものを削除するときや、 コマンドラインスクリプトの場合などがあります。 ハングしたものを殺すために 1 回限りのクライアントを開くとき、またはコマンド ライン スクリプトで。

非常に役立つことの1つは、アプリ内のデータベースへのアクセスをすべて1つのファイルに集中させることです。 散らかさないように pg.connect の呼び出しや新しいクライアントを散在させないことです。以下のようなファイルを用意します。 db.js のようなファイルがあり、それは次のようなものです。

module.exports = {
   query: function(text, values, cb) {
      pg.connect(function(err, client, done) {
        client.query(text, values, function(err, result) {
          done();
          cb(err, result);
        })
      });
   }
}

こうすることで、実装を pg.connect からクライアントのカスタムプールなどに実装を変更し、一箇所で変更するだけでよいのです。

を見てみましょう。 node-pg-queryモジュール を見てください。