2016-09-19 47 views
0

所以我使用pg-promise來查詢我的數據庫。由於我使用的Heroku Postgres的(免費版),最大連接數爲20使用pg-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,無限期連接增加,我的應用程序崩潰的數量。

我該如何解決這個問題?我每次運行查詢時都必須發佈客戶端嗎?

編輯:

所以我編輯我的代碼,這是我究竟是如何使用它,現在,我仍然有同樣的問題。

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對象執行單個查詢,並且您應該在taskstransactions內執行查詢鏈。

您可以像這樣更改默認池大小:pgp.pg.defaults.poolSize = 20。你應該在初始化圖書館之後立即開始。

+0

感謝您抽出寶貴的時間:) 好了,所以現在我使用它像這樣(仍然有同樣的問題): 常量PGP =需要(「PG-承諾」)(); pgp.pg.defaults.poolSize = 10; const db = pgp(process.env.DATABASE_URL); db .any(...)。then(...).catch(...) – justasking

+0

@justasking當池大小達到最大值時,庫不會崩潰。如果你的應用程序崩潰了,那麼它肯定是別的東西。嘗試調試並查看究竟出了什麼問題。你應該在這裏發佈錯誤堆棧;) –

+0

崩潰不是問題。問題是每次我在數據庫中查詢某個東西時都會建立一個新連接,並且連接數超出了我設置的poolSize。有可能我誤解了池的工作方式,但是我想在這裏解決的問題是總是少於20個連接到數據庫。 – justasking