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

一時テーブルでpostgres関数を呼び出すノードがメモリリークを引き起こしている

    その後、それらを使用しないでください。以下に示すように、引き続きクエリを直接実行できます。

    これは完全に間違ったアプローチではありません。他の人が実装したものをはるかに簡単に使用できるように作成しようとしているため、非常に厄介なアプローチです。その結果、メモリリークなど、多くの問題を引き起こす可能性のある多くの間違いを犯しています。

    pg-promise を使用したまったく同じ例の単純さと比較してください :

    var pgp = require('pg-promise')();
    var conString = "postgres://username:[email protected]/database";
    var db = pgp(conString);
    
    function getJobs() {
        return db.tx(function (t) {
            return t.func('get_jobs');
        });
    }
    
    function poll() {
        getJobs()
            .then(function (jobs) {
                // process the jobs
            })
            .catch(function (error) {
                // error
            });
    
        setTimeout(poll, 55);
    }
    
    poll(); // start polling
    

    ES6構文を使用するとさらに簡単になります:

    var pgp = require('pg-promise')();
    var conString = "postgres://username:[email protected]/database";
    var db = pgp(conString);
    
    function poll() {
        db.tx(t=>t.func('get_jobs'))
            .then(jobs=> {
                // process the jobs
            })
            .catch(error=> {
                // error
            });
    
        setTimeout(poll, 55);
    }
    
    poll(); // start polling
    

    あなたの例で私が完全に理解していなかった唯一のこと-単一のSELECTを実行するためのトランザクションの使用 。データを変更しないため、これはトランザクションの一般的な目的ではありません。一部のデータも変更する実際のコードを縮小しようとしていたと思います。

    トランザクションが必要ない場合は、コードをさらに次のように減らすことができます。

    var pgp = require('pg-promise')();
    var conString = "postgres://username:[email protected]/database";
    var db = pgp(conString);
    
    function poll() {
        db.func('get_jobs')
            .then(jobs=> {
                // process the jobs
            })
            .catch(error=> {
                // error
            });
    
        setTimeout(poll, 55);
    }
    
    poll(); // start polling
    

    更新

    ただし、前のリクエストの終了を制御しないことは危険なアプローチであり、メモリ/接続の問題が発生する可能性もあります。

    安全なアプローチは次のとおりです。

    function poll() {
        db.tx(t=>t.func('get_jobs'))
            .then(jobs=> {
                // process the jobs
    
                setTimeout(poll, 55);
            })
            .catch(error=> {
                // error
    
                setTimeout(poll, 55);
            });
    }
    


    1. OracleException(0x80004005)Oracleデータベースに接続する場合

    2. Laravelデータベーススキーマ、Nullable Foreign

    3. Oracle.DataaccessはGACにあります。使用するバージョンを制御できますか?

    4. postgresqlですべてのデータベースとそのスキーマを一覧表示するにはどうすればよいですか?