2015-11-12 9 views
5

下記のnode-postgresパッケージを参照していますが、この質問はむしろ一般的なものです。ノードjsアプリケーションでのDB接続プールの処理のベストプラクティス?

トップレベルのhttpリクエストハンドラのプールから接続(クライアント)を取得(接続)し、2)そのハンドラ内のすべてのビジネスを行い、3)それを再びリリースします。あなたが終わったらプールしてください。

私はそれがその例でうまくいくと思いますが、あなたのアプリがやや大きくなるとすぐに、これはすぐに痛みを伴うようになります。

  1. は、「クライアント+仕事を得る+クライアントリリース」どこでも私はデシベルに話をする必要があるアプローチをん...私はこれら二つのオプションを考えていますが、私はかなりよく分かりません。

    これは良い選択だと思われますが、トップhttpリクエストごとに複数の接続/クライアントを食うことにはなりません(プロジェクトの多くの場所で並列非同期dbコールがあります)。

  2. require()

    介してアクセス可能なクライアント/接続が、これは良いアイデアと実際に合理的になんとかですか?をグローバルに共有の参照を代入してみてくださいすべての醜いケース(例えば、並列非同期のエラーなど)で「プールリリースに戻る」をうまく処理することは可能ですか?

ありがとうございます。

+0

一切しないでください。代わりに、[pg-promise](https://github.com/vitaly-t/pg-promise)のような高水準のライブラリを信頼して、すべて自動的に行います。 –

+0

おかげさまで@vitaly-t、私はpg-promiseを見ていきます –

+1

私はいくつかのWebアプリケーションを扱っており、pin-a-db-connection-to-the-requestモデルを使用するすべてが必然的にデータベースリソースを処理する方法からスケーラビリティの問題に終わった。(Get + Use + Return)は私の本で優れています。間違っている可能性が非常に少ない事柄。 – Brandon

答えて

1

さて、私はそれを理解しようとしていました。私は、クエリを実行する必要がある場合、だから、

var Q = require('q'); 
var MongoClient = require('mongodb').MongoClient; 

module.exports.getDb = getDb; 

var db = null; 

function getDb() { 
    return Q.promise(theDb); 

    function theDb(resolve, reject, notify) { 
    if (db) { 
     resolve(db); 
    } else { 
     MongoClient.connect(mongourl, mongoOptions, function(err, theDb) {    
      resolve(db); 
     } 
     }); 
    } 
    } 
} 

getDb().then(function(db) { 

    //performe query here 

}); 

少なくとも、MongoDBのためにこれは終わりで、いくつか考慮した後とJohn Papa's codeの影響を受けて私はこのようなdatabaseモジュールを使用することを決めました見てような良い実践here

+0

あなたの答えに感謝します。私はあなたのコードを試していないが、私はその点を見ていると思う。 1つのグローバルdbインスタンスを持つ方法を示しています(元の質問の2番目のポイント)。しかし、リリースはどのように行われていますか? –

+0

私はMongoでのリリースの必要性を知らず、その答えを忘れてしまった。このソリューションは、Postgresにとってうまくいかないようです。 –

0

データベースの種類とデータベースを表す基本フレームワークによって最適なアドバイスが異なります。

Postgresの場合、基本フレームワーク/ドライバはnode-postgresで、接続プールのサポートが組み込まれています。しかし、そのサポートは低レベルです。

ハイレベルアクセスの場合は、tasks,transactionsなどの自動接続管理をサポートするpg-promiseを参照してください。

0

ここは私にとってうまくいきました。

var pg = require('pg'); 
var config = { pg : 'postgres://localhost/postgres' }; 

pg.connect(config.pg, function(err, client, done) { 
    client.query('SELECT version();', function (err, results) { 
    done(); 

    //do something with results.rows 
    }); 
}); 
関連する問題