NetEase / pomelo-cn

The Chinese issues for pomelo.
38 stars 13 forks source link

pomelo中使用mysql #144

Open liketo opened 11 years ago

liketo commented 11 years ago

声明:本人纯服务器开发新手菜鸟,分析的不一定正确,分析的也没啥技术含量,主要是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', 'chat', function () { var dbclient = require('./app/dao/mysql/mysql').init(app); app.set('dbclient', dbclient);//这个dbclient就是访问数据库的接口 });

 3. dao-pool.js 这个主要是创建连接池,作用是提高访问效率的,比如一个进程需要个长时间读取数据库动作,如果没有这个池,只能等完成,有了这个池子就可以再建立个连接,这个池子就是管理这些连接的管理器。这分析完全不知道靠不靠谱。

网上找文档时发现这样一段描述generc-pool缺陷的话**: “generc-pool小巧精悍,总共只有几百行,完全由js代码写成。使用的方法页很简单。但是有一点不足的地方是,实例A和实例B建立链接,初始化连接池poolAB之后,如果实例A在守护进程的作用下进行了重启,此时poolAB中的所有连接都会失效,但是generic-pool本身只对超时的连接进行了处理,对于这种虽然没有超时但是已经失效的连接并没有相应操作。这个缺陷为我的工作带来了极大困扰。我对该模块进行了小小的改动,实现了对失效链接的处理。 ”, 不知道需要处理下不? 原文链接:http://blog.csdn.net/zenghuaidong/article/details/7428808 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(); };

/**

/**

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 chatList for chatDao 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);
    }
});

}; 弄完这个就该去看Sync了。

weiyongqing123 commented 11 years ago

看后真的受益匪浅,我有个疑问就是为什么demo游戏不用mongodb数据库呢?

liketo commented 11 years ago

数据库可以自己换呀,用什么都可以

crylg commented 7 years ago

一使用就会报错 pomelo-rpc - [mqtt-acceptor] process rpc message error ReferenceError: id is not defined 在dbclient.query(sql, args, function (err, res)之后 这是什么原因呢 断点看到dbclient执行过初始化操作