問題タブ [node-postgres]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - pg ダンプ後にテーブルに挿入
以前pg_dump
は、新しいデータベースにテーブルを作成していました。その後default autoincrementer
、シリアルキーの を使用してテーブルに行を挿入できるようにしたいと考えています。これが私がテーブルに持っているものです:
このtable (smtable)
では、a
がキーです ( として設定serial
)。
今、次のステートメントを実行すると:
次のエラーが表示されます。
next_key
このステートメントをテーブルに挿入するにはどうすればよいですか..
node.js - node-postgres : クエリが順番に実行されていません
私は挿入と更新のコードを2つの異なるファイルに保持しており、条件に基づいて常に挿入を最初に実行してから更新する必要があります。しかし、どういうわけか更新が最初に実行され、次に挿入されます
test.js : 簡略化されたコード
出力
ノート :
この問題はasyncを使用することで簡単に解決できます。しかし、私の挿入コードと更新コードは別のファイルにあり、状況によっては更新コードが実行される可能性があります。したがって、async を使用したくありません。
問題
挿入クエリが最初に実行されるのに、更新が出力で最初に終了するのはなぜですか
何か不足していますか..?
node.js - Node.js Postgres Wiki の例で、http 要求ごとに複数のレコードが挿入されるのはなぜですか?
アプリにnode-postgres ( pg
NPM 上)を使用していますが、問題があったため、Wikiの例に戻ることにしました。
この例を実行すると、各 http要求によって2 つのレコードが Postgres ("visit") テーブルに挿入されます。これは望ましい動作ですか...?
サンプル コードを Heroku に公開しました: https://node-postgres-example.herokuapp.com
(注: Google Chromeを使用してアクセスしてください)
注: Wiki のコードに 3 つの変更を加えて、server.js
Heroku で実行できるようにしました。これは GitHub にあります: https://github.com/dwyl/postgres-connection-pool-test
( server.js に加えた変更は、(1)visit
テーブルがまだ存在しない場合はテーブルを作成するため、(2) postgres 接続文字列を取得するため、process.env.DATABSE_URL
(3) Heroku でリッスンするprocess.env.PORT
ためだけです。残りのすべてのコードは Wiki の例のとおりです)
node.js - 一時テーブルを使用して postgres 関数を呼び出すノードが「メモリ リーク」を引き起こす
get_jobs
トランザクション内で、node-postgres
brianc のパッケージを使用して 1 秒間に 18 回、Postgres (Amazon RDS マイクロ インスタンス) 関数を呼び出す node.js プログラムがあります。
ノード コードは、brianc の基本的なクライアント プーリングの例の拡張バージョンにすぎません。
したがって、Postgres は次のようになります。
... 55msごとに繰り返されます。
get_jobs
このような一時テーブルで書かれています
一時テーブル パターンを使用したのは、これjobs
が常に からの行の小さな抽出であることを知っているためreally_big_table_1
です。(私はこれを SQL Server で非常に効果的に使用しており、現在はクエリ オプティマイザーを信頼していませんが、これが Postgres の間違ったアプローチであるかどうか教えてください!)
クエリは小さなテーブルで 8 ミリ秒 (ノードから測定) で実行され、次のジョブが開始される前に 1 つのジョブ「ポーリング」を完了するのに十分な時間です。
問題: この速度で約 3 時間ポーリングした後、Postgres サーバーがメモリ不足になり、クラッシュします。
すでに試したこと...
一時テーブルなしで関数を書き直せば、Postgres はメモリ不足にはなりませんが、一時テーブル パターンを多用するので、これは解決策ではありません。
ノード プログラムを停止すると (クエリの実行に使用する 10 個の接続が強制終了されます)、メモリが解放されます。ポーリング セッション間でノードを 1 分間待機させるだけでは同じ効果が得られないため、プールされた接続に関連付けられた Postgres バックエンドが保持しているリソースが明らかに存在します。
ポーリングの実行
VACUUM
中に a を実行しても、メモリ消費には影響せず、サーバーは停止し続けます。ポーリング頻度を減らしても、サーバーが停止するまでの時間だけが変わります。
DISCARD ALL;
それぞれの後に追加しCOMMIT;
ても効果はありません。s の s の代わりに
DROP TABLE jobs; DROP TABLE jobs_extra;
afterを明示的に呼び出します。サーバーはまだクラッシュします。RETURN query ()
ON COMMIT DROP
CREATE TABLE
CFrei の提案に従って、
pg.defaults.poolSize = 0
プーリングを無効にするためにノード コードに追加されました。サーバーはまだクラッシュしましたが、以下の最初のスパイクのように見えた以前のすべてのテストよりもはるかに時間がかかり、スワップがはるかに高くなりました (2 番目のスパイク)。後で、pg.defaults.poolSize = 0
プーリングが期待どおりに無効にならない可能性があることがわかりました。
これに基づいて、「自動バキュームでは一時テーブルにアクセスできません。したがって、適切なバキューム操作と分析操作は、セッション SQL コマンドを介して実行する必要があります。」、
VACUUM
ノード サーバーからa を実行しようとしましVACUUM
た ("inセッション」コマンド)。私は実際にこのテストを機能させることができませんでした。データベースに多くのオブジェクトがありVACUUM
、すべてのオブジェクトを操作しているため、各ジョブの繰り返しの実行に時間がかかりすぎていました。一時テーブルのみに制限VACUUM
することは不可能でした - (a) 実行できませんVACUUM
トランザクション内および (b) トランザクション外では、一時テーブルは存在しません。pg_attributes
:P 編集: Postgres IRC フォーラムの後半で、VACUUM は一時テーブル自体には関係ないが、その TEMP TABLES の原因で作成および削除された行をクリーンアップするのに役立つ可能性があると有益なチャップが説明しました。いずれにせよ、「セッション中」の VACUUM は答えではありませんでした。DROP TABLE ... IF EXISTS
CREATE TABLE
の代わりに、の前にON COMMIT DROP
。サーバーはまだ死んでいます。CREATE TEMP TABLE (...)
のinsert into ... (select...)
代わりにCREATE TEMP TABLE ... AS
、の代わりにON COMMIT DROP
。サーバーが死ぬ。
ではON COMMIT DROP
、関連するすべてのリソースを解放していませんか? 他に何が記憶を保持している可能性がありますか? どうすれば解放できますか?
node.js - out パラメータの結果は、ノード pg モジュールによって返されます - postgresql
以下のようにpostgresqlでプロシージャを作成しました。
これで、ノード pg からこの手順を次のように実行しました。
以前、上記のコードを実行すると、次の形式の結果が得られました。
しかし、今はノード pg モジュールをアンインストールし、ノード pg モジュールを再度インストールしました。次の形式で結果が得られます
したがって、違いは、レコードの名前と値のペアを返す代わりに、関数名と値の配列を返すことです。別のバージョンの node pg モジュールをインストールしようとしましたが、問題は解決しません。
前もって感謝します。