app.loadConfig('mysql', app.getBase() + '/config/mysql.json');
2.在app.js中为每个需要访问数据库的server创建dbclient,dbclient就是与数据库的一个客户端
app.configure('production|development', 'user', function ()
3. dao-pool.js 这个主要是创建连接池,作用是提高访问效率的,比如一个进程需要个长时间读取数据库动作,如果没有这个池,只能等完成,有了这个池子就可以再建立个连接,这个池子就是管理这些连接的管理器。
“generc-pool小巧精悍,总共只有几百行,完全由js代码写成。使用的方法页很简单。但是有一点不足的地方是,实例A和实例B建立链接,初始化连接池poolAB之后,如果实例A在守护进程的作用下进行了重启,此时poolAB中的所有连接都会失效,但是generic-pool本身只对超时的连接进行了处理,对于这种虽然没有超时但是已经失效的连接并没有相应操作。
var createMysqlPool = function(app) {
var mysqlConfig = app.get('mysql'); //获取mysql配置信息
return _poolModule.Pool({
name: 'mysql',//pool的名字
create: function(callback) {
var mysql = require('mysql');//加载mysql 模块
var client = mysql.createConnection({
host: mysqlConfig.host,
user: mysqlConfig.user,
password: mysqlConfig.password,
database: mysqlConfig.database
});
callback(null, client);
},
destroy: function(client) {
client.end();
},
max: 10, //池子的最大连接接容量
idleTimeoutMillis : 30000,一个连接超过这个值就断开。
log : false
});
};
NND.query = function(sql, args, cb){
_pool.acquire(function(err, client) {
if (!!err) {
console.error('[sqlqueryErr] '+err.stack);
return;
}
client.query(sql, args, function(err, res) {
_pool.release(client);//这里要注意下,释放这个client,估计上边的idleTimeoutMillis ,就是在这之后开始统计,如果没有访问数据库操作,这就这个app与数据库的链接断开
cb(err, res);
});
});
};
NND.shutdown = function(){
_pool.destroyAllNow();
};
/**
init database
*/
sqlclient.init = function(app) {
if (!!_pool){
return sqlclient;
} else {
NND.init(app);
sqlclient.insert = NND.query;
sqlclient.update = NND.query;
sqlclient.delete = NND.query;
sqlclient.query = NND.query;
console.log("init Ok");
return sqlclient;
}
};
/**
chatDao.addChatHistorySql = function(playerName,txt ,cb) {
var sql = 'insert into chatList (playerName, txt) values ( ?, ?)';
var args = [playerName, txt];
var dbclient = pomelo.app.get('dbclient');
console.log(dbclient);
dbclient.insert(sql, args, function(err, res) {
if (err) {
logger.error('create userList for userDao failed! ' + err.stack);
//utils.invokeCallback(cb, err, null);
} else {
console.log("sql save Ok!");
//var bag = new Bag({id: res.insertId});
//utils.invokeCallback(cb, null, bag);
}
});