[解決済み] Knexコネクションを破壊する場所
質問
私は、以下のようなプロジェクトを持っています。
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
を出力することができます。
res1
と
res2
. しかし、問題は、接続が無期限にハングアップし、CMDが返されないことです。
しかし、コメントアウトを解除すると
knex.destroy()
から
libs.js
であれば
doThis
が実行されると、CMD は次の場所でハングアップします。
doThat
で閉じた接続がもうないためです。
doThis
.
私の質問は:
の最適な位置は?
knex.destroy()
? それとも他に方法があるのでしょうか?
お忙しい中、ありがとうございました。
解決方法は?
ケネックス destroy() は1回限りの操作のようです。接続を破棄した後、次の操作のために新しい接続プールが必要になるかもしれません。
エクスポートした db クライアントモジュール はキャッシュされる をノードモジュールキャッシュに格納し、接続プールを必要とするたびに新しい接続プールを作成する必要はありません。
これは意図的な使い方で、アプリが終了するか、すべてのテストが終了すると、プールは破棄されることになっています。もし、操作のたびに接続を作成/破棄する理由がある場合(サーバーレス環境など)、破棄されたクライアントを再利用するのではなく、毎回新しいインスタンスを作成する必要があります。
そうでなければ、コネクションプーリングの目的が達成されません。
更新情報 ラムダ/サーバレス環境について。
技術的には、関数とそのリソースはラムダ関数が実行された後に解放されることになっています。これは、真にステートレスな関数のために必要なことです。したがって、関数が終了したら、コネクションをクローズすることが推奨されます。しかし、多くの関数が多くのコネクションをオープン/クローズすると、最終的にDBサーバーのコネクションが足りなくなる可能性があります ( 本論 など)。のような中間プールを使用するのも一つの解決策かもしれません。 PgBouncer または PgPool DBサーバーとLambdaファンクション間の接続をネゴシエートするものです。
もう一つは、プラットフォーム提供者(AWS)がラムダ環境に特別なプーリング機能を追加し、長寿命のリソースを共有させる方法である。
関連
-
[解決済み] テスト
-
[解決済み】npx コマンドが見つかりません。
-
[解決済み】ブロックスコープの宣言は、ストリクトモード以外ではまだサポートされていません。
-
[解決済み】MongooseでEnumを作成し使用する方法
-
[解決済み】「npm install」と「npm rebuild」の違いとは?
-
[解決済み] nodeファイルの先頭にある"/usr/bin/env node "は、具体的には何をするのですか?
-
[解決済み] joiライブラリを使用して2つの時間を比較する方法
-
[解決済み] TypeError: コールバックはnodejsの関数ではありません。
-
[解決済み] node.js - リクエスト - "emitter.setMaxListeners() "はどのように?
-
[解決済み] npmはどこにパッケージをインストールするのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] (node:63208) DeprecationWarning: collection.ensureIndex は非推奨です。代わりにcreateIndexesを使用してください [重複]。
-
webpack ENOENTソリューションの起動
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
[解決済み] ブラウザで動作しているURLで「connect ETIMEDOUT」エラーが発生する原因は何ですか?
-
[解決済み] npm install エラー - ローカルの発行者証明書を取得できません。
-
[解決済み] E: npm パッケージを見つけることができません。
-
[解決済み] S3 Bucket に何かを送信しようとすると、AWS Missing credentials が表示される (Node.js)
-
[解決済み] nvm は npm config の "prefix" オプションと互換性がありません。
-
[解決済み] バルク更新を行う。
-
[解決済み] NPMが同じエラーで固まる EISDIR: ディレクトリに対する不正な操作、エラーで読み込み (ネイティブ)