2016-09-19 7 views
0

私はデータベースを照会するためにpg-promiseを使用しています。私はHerokuののPostgresの(無料版)を使用しているので、接続の最大数が、DBに接続するために20pg-promiseを使用した接続

である、私は私が使用している

pgp(process.env.DATABASE_URL + '?poolSize=10') 
 
    .connect() 
 
    .then(sco => { 
 
    dbclient = sco; 
 
    }) 
 
    .catch(err => { 
 
    console.error(err); 
 
    })

を使用しますクエリーを実行するdbclient変数

dbclient 
 
    .one('select ...') 
 
    .then(() => ...) 
 
    .catch(res.status(500).send);

私は、10に無期限の接続が増加し、私のアプリのクラッシュの数をプールのサイズを設定していたとしても。

どうすればこの問題を解決できますか?クエリを実行するたびにクライアントをリリースする必要がありますか?

EDIT:

だから私は、これは私がそれを今使用している、と私はまだ同じ問題を抱えている正確にどのようにされ、私のコードを編集しました。

const pgp = require('pg-promise')(); 
 
pgp.pg.defaults.poolSize = 10; 
 

 
router.get('/', (req, res) => { 
 
    pgp(process.env.DATABASE_URL).any('select ...') 
 
     .then((result) => res.status(200).send(result)) 
 
     .catch(err => res.status(500).send({err})); 
 
});

答えて

1

まず、全く方法connectを使用しないでください。データベースオブジェクトは接続を自動的に管理できます。方法connectは、setting up listenersexplicitely verify the connectionのような非常に特殊なタスクのためだけに存在します。

dbオブジェクトに対して1つのクエリを直接実行する必要があります。tasksまたはtransactionsのクエリチェーンを実行する必要があります。

デフォルトのプールサイズは、pgp.pg.defaults.poolSize = 20のように変更できます。そして、ライブラリを初期化した直後に、最初からそれを行うべきです。

+0

ありがとうございました:) これで私はこれを好きなように使っています(同じ問題が残っています): const pgp = require( 'pg-promise')(); pgp.pg.defaults.poolSize = 10; const db = pgp(process.env.DATABASE_URL); db .any(...)。then(...).catch(...) – justasking

+0

@justaskingプールサイズが最大になると、ライブラリはクラッシュしません。あなたのアプリがクラッシュした場合、それは他の何かでなければなりません。デバッグし、正確に何がうまくいかないかを確認してください。そしてここにエラースタックを投稿してください;) –

+0

クラッシュは問題ではありません。問題は、データベースで何かを照会するたびに新しい接続が確立され、接続数が設定したpoolSizeを超えてしまうことです。プールの仕組みが誤解されている可能性がありますが、私がここで解決したい問題は、データベースへの接続が常に20未満になることです。 – justasking

関連する問題