Express.js Web アプリで socket.io を使用して、SQL クエリを呼び出すイベントをリッスンしているクライアントのソケットを開きます。サーバーソケットは次のようになります。
socket.on('updates', function(PEMSID){
setInterval(function(){
gps_helper.get_gps(PEMSID, function(data){ //query GPS table for marker coordinates
socket.emit('message', {message: data});
});
}, 10000);
get_gps()
そのため、新しいレコードがテーブルに追加されたかどうかを確認するために長いポーリングを行う関数が10 秒ごとに呼び出されます。関数は次のget_gps()
ようになります。
exports.get_gps = function(PEMSID, callback) {
var sql = require('msnodesql');
var connStr = "Driver={SQL Server Native Client 11.0};Server=myHost,1433;Database=myDB;UID=Username;PWD=Password;";
var mQuery = "EXEC Z_CoordsByPEMS '" + PEMSID + "'";
sql.open(connStr, function(err,conn){
if(err)
return console.error("Could not connect to sql: ", err);
conn.query(mQuery,function(err,results){
if (err)
return console.error("Error running query: ", err);
callback(results); //return query results
});
});
}
私が遭遇している問題は、get_gps()
更新をポーリングするたびに SQL データベースへの新しい接続を開いていることです。サーバーの CPU が最終的に最大容量に達し、今後のすべてのクエリがタイムアウトするため、これは明らかにデータベースをホストするサーバーに非常識なオーバーヘッドを引き起こし、変更する必要があります。モジュールを使用して SQL db タスクを実行していますが、API に既存の接続を閉じる関数msnodesql
がないようです。close()
1 つのグローバル接続を作成し、すべての新しいソケットがロング ポーリングを行うためにそれを参照する必要があると思います。ただし、Express.js/node.js の非同期の性質を考えると、グローバル接続を設定する方法は、可能であればわかりません。