nodeにはいくつかのmysqlモジュールがあり、純粋なjsが実装されているもの(node-mysqlなど)もあれば、c libmysqlに基づいているものもあります。
より「クリーン」に見える余分なmysqlライブラリを必要としないため、node-mysqlを非常に好みます。しかし、接続とクエリでタイムアウト機能がサポートされていないことにも気付きました。これは、環境によっては問題を引き起こす可能性があります。
私の質問は次のとおりです。このタイムアウトの問題をきれいに解決した人はいますか?
nodeにはいくつかのmysqlモジュールがあり、純粋なjsが実装されているもの(node-mysqlなど)もあれば、c libmysqlに基づいているものもあります。
より「クリーン」に見える余分なmysqlライブラリを必要としないため、node-mysqlを非常に好みます。しかし、接続とクエリでタイムアウト機能がサポートされていないことにも気付きました。これは、環境によっては問題を引き起こす可能性があります。
私の質問は次のとおりです。このタイムアウトの問題をきれいに解決した人はいますか?
これを修正するために行ったことは、エラー メッセージを確認し、必要に応じて再接続することでした。
これは、彼らがhttps://github.com/felixge/node-mysql#server-disconnectsで提案する方法です
ドキュメントが変更された場合のサンプルコードは次のとおりです
function handleDisconnect(connection) {
connection.on('error', function(err) {
if (!err.fatal) {
return;
}
if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
throw err;
}
console.log('Re-connecting lost connection: ' + err.stack);
connection = mysql.createConnection(connection.config);
handleDisconnect(connection);
connection.connect();
});
}
handleDisconnect(connection);
メソッド createConnection の代わりにメソッド mysql.createPool を使用すると、同じ問題が発生しました。
これは私のコードです。
/*jslint node: true */
'use strict';
var Q = require('q');
var mysql = require('mysql');
var _config;
var env = process.env.NODE_ENV || 'development';
if (env === 'development') {
_config = {
host : 'localhost',
user : 'root',
charset : 'latin1',
password : '123456',
database : 'DEVDB',
connectionLimit: 10
};
}else {
_config = {
host : 'PRODUCTIONHOST',
user : 'root',
charset : 'latin1',
password : 'PRODUCTIONPASS',
database: 'PRODUCTIONDB',
connectionLimit: 10
};
}
var _pool = mysql.createPool(_config);
var runquery = function() {
var deferred = Q.defer();
var args = Array.prototype.slice.call(arguments);
//console.log(args);
args.push(function(err, results){
if (err) {
deferred.reject(new Error(err));
} else {
deferred.resolve(results);
}
});
_pool.query.apply(_pool, args);
return deferred.promise;
};
module.exports = runquery;
使用例;
runquery('select id from users where mail = ?', 'eugenioclrc')
.then(function(rows){
console.log(rows);
});