2016-09-02 6 views
0

いくつかのRESTサービスを含むnode.jsアプリケーションを作成しました。これらのサービスは、クエリーを実行するためにデータベース(OracleやDB2など)に接続します。ノードjsデータベース接続が別のモジュールにある

私はnode.jsプログラミングの初心者なので、私のケースについての質問があります: データベースにアクセスする正しい方法は何ですか?アプリケーションの実行中に接続リファレンスを1つ作成し、RESTサービスが呼び出されたときに同じ接続インスタンスを使用する方がよいでしょうか?

私は別のモジュールでデータベース接続を含んでいるいくつかの例を発見し、アプリでそのモジュールを使用し、そのようなこと:

db2.js:

var db2 = require('ibm_db'); 

var db2ConnSettings = "DRIVER={DB2};DATABASE=mydb;HOSTNAME=localhost;UID=db2test;PWD=db2test;PORT=50000;PROTOCOL=TCPIP"; 

var db2Conn = db2.open(db2ConnSettings, function(err, conn) { 
     if (err) 
      return console.log(err); 
    }); 

module.exports = db2Conn; 

server.js:

var express = require('express'); 
var app = express(); 
var db2Connection = require('./db2.js'); 

app.get('/data', function(req, res) { 
    console.log(db2Connection); 
    // make some query 
}); 

このサービスを呼び出す場合、db2connectionundefinedです。どうして?どのように私はdb2.jsファイルからのdb2接続を取得する必要がありますか? @Sirkoで言っ

+0

問題は、データベース接続が非同期に設定されていることです。実際の接続はコールバックの 'conn'パラメータとして得られ、' .open() 'の同期戻り値とはなりません。 – Sirko

+0

私は 'ibm_db'に慣れていませんが、何が起きているのかを理解するための基本的なデバッグを提案したいと思います。いくつかの 'console.log'を別の場所に追加してください。たとえば、db2.jsのように最初にロードされているかどうかを確認し、dbConnからログアウトして' db2.open'が値を返したかどうかを確認します。 – Whothehellisthat

+0

@Whathhellist私はすでにそれを行っており、 'db2.js'でも' undefined 'です。だから私は本当にコールバックと関係があると信じていますが、実際には 'server.js'ファイルで動作させることはできません。 – peterremec

答えて

2

として:

db2.js

var db2 = require('ibm_db'); 
var db2ConnSettings = "DRIVER={DB2};DATABASE=mydb;HOSTNAME=localhost;UID=db2test;PWD=db2test;PORT=50000;PROTOCOL=TCPIP"; 

var err, conn; 
var callbacks = []; 

module.exports = function(callback) { 
    // db2 module is called 

    if (err || conn) { 
    // connection has already been established 
    // (results of db2.open have been stored) 
    // callback immediately 
    callback(err, conn); 
    } 
    else { 
    // connection has not been established 
    // store the callback for when db connects 
    callbacks.push(callback); 
    } 
}; 

db2.open(db2ConnSettings, function(_err, _conn){ 
    // db has connected 

    err = _err; conn = _conn; // store results 
    var next_callback; 

    // array.pop() removed the last item from the array 
    // and returns it. if no items are left, returns null. 
    // so this loops through all stored callbacks. 
    while(next_callback = callbacks.pop()) { 
    // the removed item is stored in next_callback 
    next_callback(err, conn); // send connection results to callback 
    } 

    // no more items in callbacks to trigger 
}); 

server.js

それが作成し、接続プールを使用するように簡単です Oracle with node-oracledbについて
var express = require('express'); 
var app = express(); 
var db2Connection = require('./db2.js')(function(err, conn) { 
    // triggered if the connection has already been established 
    // or as soon as it HAS been established 
    app.get('/data', function(req, res) { 
     console.log(conn); 
     // ... 
    }); 
}); 
+0

私は確信していませんが、ソリューションが新しいデータベース接続が確立されるたびにここでのように簡単な場合は、だから、コードの残りの部分に応じて、多くの接続を終了することができます。 – Sirko

+0

十分に公正。私はそれを簡単な約束のようなシステムで更新しました。 – Whothehellisthat

+0

@Whathhellisthatありがとう、それは働いた。あなたはそのコードにいくつかのコメントを追加してもよろしいですか?私はそれが何かを理解したいと思います... – peterremec

2

。あなたのアプリケーションは、HTTP REST要求を処理するたびにプールから無料で接続します。 exampleswebapp.jswebapppromises.jsを見てください。 Node-oracledbには、接続負荷スパイクを処理する「接続プールキュー」(docを参照)があります。また、別のモジュールで作成されたプールに簡単にアクセスできる「接続プールキャッシュ」(ドキュメント参照)もあります。

+0

私は、アプリケーションが短期間にわずかな接続しか使用しないのであれば、接続プールを作成する必要はないと思いますか?その場合の最も一般的なアプローチは何ですか?データベースアクセスで複数のRESTサービスを使用している場合、サービスが呼び出されるたびに新しい接続を作成する必要がありますか、同じ接続参照を使用する必要がありますか? – peterremec

+1

私はおそらく小さなプールに行くだろう。 –

+0

ありがとうございました! – peterremec

関連する問題