pomelo.sync分析

声明:pomelo中官方例子中的mysql的使用比较分散。
准备工作:
1.先创建mysql.json配置文件,里面放数据库名子 帐号密码端口。
2.用mysql命令行创建个跟配置文件中名字相同的数据库,然后创建个表,启动数据库。
3.npm install mysql,npm install generic-pool;
代码:
1.在app.js中加载mysql.json配置文件

app.loadConfig('mysql', app.getBase() + '/config/mysql.json');

2.在app.js中为每个需要访问数据库的server创建dbclient,dbclient就是与数据库的一个客户端
app.configure('production|development', 'user', function ()
{
var dbclient = require('./app/dao/mysql/mysql').init(app);
app.set('dbclient', dbclient);//这个dbclient就是访问数据库的接口
});

 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
});
};

  1. mysql.js 这个文件是给应用使用的数据库接口 var NND = {}; //实在没看懂NND什么意思,娘娘的。难道真是“娘娘的”? NND.init = function(app){ _pool = require('./dao-pool').createMysqlPool(app); };

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;
    }
    };

/**

  • shutdown database */ sqlclient.shutdown = function(app) { NND.shutdown(app); }; 5.然后就可以在chat server中使用sql语句与dbclient访问数据库了

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);
    }
});

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章