数据库连接池DBPool分析(九):Theron库+gtest来测试
来源:互联网 发布:淘宝改差评技巧 编辑:程序博客网 时间:2024/05/22 01:42
国庆节在家里面学习了Theron这个高并发的库的使用方法,获益良多。
Theron的官网:http://www.theron-library.com/
最特别的就是Theron 是Actor的模型,而不是object。这一点由于我并非是从JAVA转向的C++语言,所以没有万物皆是对象这个强烈的观点。
一般面向对象的三个特性:组合,继承,和多态。从组合上来说,就是一个class A为了调用class B的方法,需要在class A的定义当中加入一个class B的对象,这是最简单的has-a的方法,但是这样的话如果class A和class B都有锁,一旦组合起来,一不小心容易变成死锁,解决这个问题的方法是使用层级锁。而在Actor模型当中,class A要调用class B的方法不用组合的形式了,而是直接发送一个message来给class B并立即返回,class B收到message之后开始唤醒,和class A并行地执行下去。
这样来看一个actor就可以是一个线程,要启动多个线程直接使用多个actor就可以了,完全拒绝了pthread函数。
为了学习Theron库,我特意重写了测试用例,用Theron来启动多个线程测试DBPool:
这里以gtest_mysql.cpp为例,当然gtest_redis也改动了
#include <iostream>#include <unistd.h>#include <stdlib.h>#include <thread>#include <Theron/Theron.h>#include <gtest/gtest.h>#include "DBPool/mysql_connection_pool.h"using std::cout;using std::endl;// 初始化全局的msql连接池,下一步是启动多个actor,每个actor从连接池当中获取一个连接,然后并行地执行命令static MysqlPoolPtr mysqlpool_ptr(new MysqlPool);// Theron的使用方法一个actor对象必须继承自Theron::Actorclass Actor : public Theron::Actor { public: Actor(Theron::Framework &framework) : Theron::Actor(framework) { // 将Actor::Handler注册 RegisterHandler(this, &Actor::Handler); // 可以在这里再注册一个函数 RegisterHandler(this, &Actor::helloworld),顺序注册的话就会顺序执行 } private: // 定义注册的函数,第一个参数是接受的message的类型,第二个参数是发送message的源地址 // 由于这里要操作sql,所以使用string类型 void Handler(const string &sql, const Theron::Address from) { // 从全局的mysql连接池当中取出一个连接 MysqlObjPtr conn = mysqlpool_ptr->GetConnection(); QueryResult queryResult; conn->ExecuteSql(sql.c_str(), queryResult); mysqlpool_ptr->ReleaseConnection(conn); for (int i=0;i<queryResult.getRowCount();i++) { for(int j=0;j<queryResult.getColumnCount();j++) { cout << queryResult.getElement(i,j) << " "; } cout << endl; } // 把一个message发送回去,这里由于源地址使用了Theron::Receiver,而Receiver接受消息的类型就是int,所以随便发送个0 Send(0, from); } };// 这个函数也可以作为main函数,但是为了使用gtest做测试,所以写在这里const char* handler(const string &sql) { Theron::Receiver receiver; Theron::Framework(framework); // 这里两个actor Actor actor(framework); Actor actor2(framework); // 说明消息是从receiver发送给actor,发送给actor之后马上就返回,不会阻塞在这里影响下面发送给actor2的操作 framework.Send(sql, receiver.GetAddress(), actor.GetAddress()); framework.Send(sql, receiver.GetAddress(), actor2.GetAddress()); // actor和actor2将并行执行 receiver.Wait(); return "hello"; }TEST(handlerTest, Test1) { // 测试用例就是一条查询的sql语句 string sql = "SELECT * FROM student;"; EXPECT_STREQ("hello", handler(sql));}int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}
回到DBPool的目录下,执行
make check
到gtest目录下执行gtest_mysql:
===================================================
数据库的连接池到这里就告一段落,接下来我打算自己实现一个tcp的socket连接池,并加上libevent,借此来深入学习网络编程。
- 数据库连接池DBPool分析(九):Theron库+gtest来测试
- 数据库连接池DBPool分析(六):gtest
- 数据库连接池DBPool分析(一):简介
- 数据库连接池DBPool分析(五):Makefile
- 数据库连接池DBPool分析(四):mysql连接池 mysql_connection_pool
- 数据库连接池DBPool分析(八):redis连接池 redis_connection_pool
- 数据库连接池DBPool分析(三):Mysql连接控制:MysqlObj
- 数据库连接池DBPool分析(七):Redis连接控制 RedisObj
- 数据库连接池DBPool分析(二):存放Mysql的查询结果 QueryResult.h
- 基于DBPool的数据库连接池
- JDBC(九)数据库连接池
- Theron库中的actor
- DBPool---Jdbc 各种数据库连接的配置
- 用 GTest 来测试MFC 程序 TDD开发
- gtest测试的使用(google出品)
- java 数据库连接方式(九)
- hotfox数据库连接池测试
- 数据库连接池性能测试
- 寄存器与缓存
- git install 报错处理
- BestCoder Round #60 5505GT and numbers
- 求大神帮忙解决一下 我ajax 传输不到后台servlet里面
- 使用jenkins进行项目构建
- 数据库连接池DBPool分析(九):Theron库+gtest来测试
- 线性表---双向循环链表
- 九度OJ 1038:Sum of Factorials(阶乘的和) (DP、递归)
- jdbc事务
- 我的博客开篇
- /proc/cpuinfo中siblings 和 cpu cores的区别
- web上传以及细节
- Struts-国际化
- uva10739(String to Palindrome)