1

私はノード、postgresql、および Web 開発ビジネス全体に不慣れです。私は現在、postgres データベースに接続し、テーブルの内容を Web ビューに表示する単純なアプリを作成しています。アプリは OpenShift でホストされます。

私の主なエントリは次のserver.jsとおりです。

var pg = require('pg');
pg.connect(connection_string, function(err, client) {
    // handle error
    // save client: app.client = client;
});

GET /次に、リクエストを処理します。

function handle_request(req, res){
    app.client.query('...', function(err, result){
        if (err) throw err; // Will handle error later, crash for now
        res.render( ... );  // Render the web view with the result
    });
}

私のアプリは動作しているようです: テーブルは Web ビューで正しくレンダリングされ、複数の接続 (異なるデバイスからの異なる Web クライアント) で動作します。ただし、数分間リクエストがない場合、後続のリクエストはタイムアウト情報でアプリをクラッシュさせます。スタック情報は次のとおりです。

/home/hai/myapp/server.js:98
            if (err) throw err;
                           ^
Error: This socket is closed.
    at Socket._write (net.js:474:19)
    at Socket.write (net.js:466:15)
    at [object Object].query (/home/hai/myapp/node_modules/pg/lib/connection.js:109:15)
    at [object Object].submit (/home/hai/myapp/node_modules/pg/lib/query.js:99:16)
    at [object Object]._pulseQueryQueue (/home/hai/myapp/node_modules/pg/lib/client.js:166:24)
    at [object Object].query (/home/hai/myapp/node_modules/pg/lib/client.js:193:8)
    at /home/hai/myapp/server.js:97:17
    at callbacks (/home/hai/myapp/node_modules/express/lib/router/index.js:160:37)
    at param (/home/hai/myapp/node_modules/express/lib/router/index.js:134:11)
    at pass (/home/hai/myapp/node_modules/express/lib/router/index.js:141:5)

接続がタイムアウトしないようにする方法はありますか (より良い)? または、オンデマンドで再接続するには (最適)? 最初にデータベースに接続するのではなく、GET /リクエストに応じてアプリを再設計しようとしました。このソリューションは最初のリクエストでのみ機能し、2 番目のリクエストでクラッシュしました。どんな洞察も高く評価されます。

4

3 に答える 3

2

postgresキープアライブ設定値を調べましたか?アイドル状態の接続がタイムアウトしないようにパケットを送信します。 http://www.postgresql.org/docs/9.1/static/runtime-config-connection.html

私もこの同様の質問を見つけました: Postgresqlでtcp_keepalives設定を使用する方法は?

また、設定された間隔でデータベースから非常にマイナーなクエリを実行することもできます。ただし、この方法は間違いなくもっとハッキングされています。

編集:次のようにクライアントを開始することもできます。

var client = new pg.Client(conString);

クエリを実行する前に、クライアントがまだ接続されているかどうかを確認できます。私はあなたが使うことができると信じています:

if(client.connection._events != null)
    client.connect();
于 2012-12-30T02:00:37.050 に答える
0

デフォルトのアイドル タイムアウトの 30 秒を必要な値に変更することもできます。例えば

pg.defaults.poolIdleTimeout = 600000; // 10 mins
于 2015-06-29T09:11:40.937 に答える