sql >> データベース >  >> RDS >> PostgreSQL

pg-promiseでのクエリタイムアウト

    pg-promiseの作者から...

    pg-promiseは、誤ったデータベース設計や不適切なクエリ実行を回避するためのハックであるため、クエリのキャンセルをサポートしていません。

    PostgreSQLは、時間のかかるクエリを実行するときに使用する必要があるイベントをサポートしているため、待機する代わりに、特定のデータ/ビューが使用可能になったときにトリガーされるようにイベントリスナーを設定できます。 LISTEN/NOTIFYの例を参照してください。

    pg-promiseを、拒否でタイムアウトする独自のカスタムクエリメソッドで拡張できますが(以下の例を参照)、これも設計上の問題に加えて別の回避策です。

    Bluebirdの使用例:

    const Promise = require('bluebird');
    
    Promise.config({
        cancellation: true
    });
    
    
    const initOptions = {
        promiseLib: Promise,
        extend(obj) {
            obj.queryTimeout = (query, values, delay) => {
                return obj.any(query, values).timeout(delay);
            }
        }
    };
    
    const pgp = require('pg-promise')(initOptions);
    const db = pgp(/* connection details */);
    

    次に、db.queryTimeout(query, values, delay)を使用できます すべてのレベルで。

    または、Bluebirdを使用している場合は、.timeout(delay)をチェーンできます。 既存の方法のいずれかに:

    db.any(query, values)
        .timeout(500)
        .then(data => {})
        .catch(error => {})
    

    参照:

    • イベントの延長
    • Bluebird.timeout

    更新

    バージョン8.5.3から、pg-promiseはプロパティquery_timeoutを介してクエリタイムアウトのサポートを開始しました 接続オブジェクト内。

    デフォルトを上書きすることができます:

    pgp.pg.defaults.query_timeout = 3000; // timeout every query after 3 seconds
    

    または、接続オブジェクト内で指定します:

    const db = pgp({
        /* all connection details */
    
        query_timeout: 3000
    });
    



    1. MicrosoftAccessを使用した学生データベースの作成

    2. データベーステストとは何ですか?それを実行する方法は?

    3. 会議を最大限に活用するための7つの戦略

    4. 共通フィールドを持たない2つのテーブルを組み合わせる