1. ホーム
  2. node.js

[解決済み] Knexコネクションを破壊する場所

2022-02-18 02:49:19

質問

を使っています。 ネックス pg .

私は、以下のようなプロジェクトを持っています。

dbClient.js

const dbClient = require('knex')({
  client: 'pg',
  connection: {
    host: '127.0.0.1',
    user: 'user',
    password: 'password',
    database: 'staging',
    port: '5431'
  }
})

module.exports = dbClient

libs.js

const knex = require('./dbClient.js')

async function doThis(email) {
  const last = await knex('users').where({email}).first('last_name').then(res => res.last_name)
  // knex.destroy()
  return last
}

async function doThat(email) {
  const first = await knex('users').where({email}).first('first_name').then(res => res.first_name)
  // knex.destroy()
  return first
}

module.exports = {
  doThat,
  doThis
}

test01.js

const {doThis, doThat} = require('./libs.js');

(async () => {
  try {
    const res1 = await doThis('[email protected]')
    console.log(res1)
    const res2 = await doThat('[email protected]')
    console.log(res2)
  } catch (err) {
    console.log(err)
  }
})()

いつ knex.destroy() から削除されました。 libs.js のようになります。 node test01 を出力することができます。 res1res2 . しかし、問題は、接続が無期限にハングアップし、CMDが返されないことです。

しかし、コメントアウトを解除すると knex.destroy() から libs.js であれば doThis が実行されると、CMD は次の場所でハングアップします。 doThat で閉じた接続がもうないためです。 doThis .

私の質問は:

の最適な位置は? knex.destroy() ? それとも他に方法があるのでしょうか?

お忙しい中、ありがとうございました。

解決方法は?

ケネックス destroy() は1回限りの操作のようです。接続を破棄した後、次の操作のために新しい接続プールが必要になるかもしれません。

エクスポートした db クライアントモジュール はキャッシュされる をノードモジュールキャッシュに格納し、接続プールを必要とするたびに新しい接続プールを作成する必要はありません。

これは意図的な使い方で、アプリが終了するか、すべてのテストが終了すると、プールは破棄されることになっています。もし、操作のたびに接続を作成/破棄する理由がある場合(サーバーレス環境など)、破棄されたクライアントを再利用するのではなく、毎回新しいインスタンスを作成する必要があります。

そうでなければ、コネクションプーリングの目的が達成されません。


更新情報 ラムダ/サーバレス環境について。

技術的には、関数とそのリソースはラムダ関数が実行された後に解放されることになっています。これは、真にステートレスな関数のために必要なことです。したがって、関数が終了したら、コネクションをクローズすることが推奨されます。しかし、多くの関数が多くのコネクションをオープン/クローズすると、最終的にDBサーバーのコネクションが足りなくなる可能性があります ( 本論 など)。のような中間プールを使用するのも一つの解決策かもしれません。 PgBouncer または PgPool DBサーバーとLambdaファンクション間の接続をネゴシエートするものです。

もう一つは、プラットフォーム提供者(AWS)がラムダ環境に特別なプーリング機能を追加し、長寿命のリソースを共有させる方法である。