刚刚简单看了一下mongos的数据库模块。它没有提供一个单独的服务进程来与数据库交互,而是在每个需要与数据库交互的服务进程内,对每个需要访问的数据库建立一条连接,并随之启一个异步查询线程(不知这样描述是否准确,大概就是说,数据库语句不是立即执行而是放入一个队列,该线程会从这个队列里取,执行真正的查询。当然,这类查询是无返回值的,决不会是select语句)
1. Database作为基类,不同的数据库有针对它的不同实现;代码里提供了mysql和sqlite两种实现。
该类的一个对象封装一条数据库连接,并有一个辅助的异步查询线程;
2.基类里实现了PQuery,对语句执行一些格式化,最终调用纯虚接口Query,执行带返回值的查询;这是典型的“模板方法”模式;
3.Execute执行无返回值的查询,只是把查询语句放入队列就返回,由异步查询线程执行语句;
DirectExecute执行无返回值的查询,不同的是,它直接访问数据库,阻塞方式查询;
4.AsyncQuery,似乎是在查询返回后,执行预先设置的回调函数;但该函数在mangos中没有被使用;
5.线程库用的是ZTHREAD, 看了一眼,蛋疼,算了。