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

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