C++ 实现简易的 sqlserver

  github.com

项目背景:RFID无线通讯原理的期末课设

项目需求:校园一卡通:基于RFID无线通讯,实现RFID识别,管理卡片信息等功能。

负责内容:Windows客户端以及Linux服务端的编写和调试

客户端使用Qt完成,实现能够读取RFID卡片UID,网络通讯的功能

服务端 在Linux上 使用  epoll,线程池,连接池 等方法实现高并发服务器,用于处理客户端请求

C++ 实现简易的 sqlserver_第1张图片

使用epoll 监听socket 内核缓冲区,实现IO多路复用

C++ 实现简易的 sqlserver_第2张图片

C++ 实现简易的 sqlserver_第3张图片

Server是本工程的总开关

 C++ 实现简易的 sqlserver_第4张图片

 C++ 实现简易的 sqlserver_第5张图片

 class  Socket 是单一Socket的功能的封装,使用成员函数实现了Socket相关功能的简易API封装,比如accept连接函数,recv接受函数,send发送函数,以及一些set用于设置socket的函数 

C++ 实现简易的 sqlserver_第6张图片 ServerSocket是Socket类的子类,继承Socket,在ServerSocket的初始化过程中就对Socket连接的一些参数根据当前Serverconf.json中的内容进行设定 

C++ 实现简易的 sqlserver_第7张图片

 SocketHandler是一个接口类,用于创建和管理监听socket以及大量的通信socket,并且使用Epoller来实现socket内和缓冲区的监听,在SocketHandler类中的handler函数中使用Epoller监听到就绪的socket来完成Task 任务类的初始化以及将Task加入到ThreadPool线程池中的任务。listen是根据listensocket来设置监听,attach和detach用于添加和取消socket在epoll中的监听,remove用于将使用完成的socket返回 成员变量 对象池socketpool。

 C++ 实现简易的 sqlserver_第8张图片

Epoller是对于epoll内核监听符epfd的封装,包含了add,del,mod等函数,用于在SocketHandler类中对于添加删除修改等功能的二次封装,wait函数用于阻塞监听内核缓冲区等 

C++ 实现简易的 sqlserver_第9张图片

 dbconf.json用于设定关于mysqlpool的一些用于初始化的数据信息

C++ 实现简易的 sqlserver_第10张图片

 MysqlConn类 封装了单个mysql连接的所有功能,包括query,update,用于读取query返回结果的value,next以及一些设置等等,整个MysqlConn类将单一数据库连接的所有操作封装起来

C++ 实现简易的 sqlserver_第11张图片

 MysqlPool类 是一个数据库连接池,dbconf.json 读取的数据就是供MysqlPool数据库连接池使用parseJsonFIle读取并在初始化的时候使用。minSize和maxSize用于produceConnection和deleteConnection动态维护数据库连接池中连接的数量,condi_variable和m_mtx用于实现数据库连接池在多线程任务中的并发,给connectQueue队列加锁。

C++ 实现简易的 sqlserver_第12张图片

 C++ 实现简易的 sqlserver_第13张图片

TaskDiapacher,该类是一个接口类,用于将已经初始化了的Task对象添加到ThreadPool线程池中,在SocketHandler函数中被初始化并使用 

C++ 实现简易的 sqlserver_第14张图片 类Task的工厂模式类,用于生产新的Task任务

C++ 实现简易的 sqlserver_第15张图片

 WorkTask,继承于Task类,在虚函数run()中定义自己的工作流程和任务,同理在EchoTask中 run函数用于测试Socket通讯是否正常

C++ 实现简易的 sqlserver_第16张图片

C++ 实现简易的 sqlserver_第17张图片

Task类,作为EchoTask和WorkTask的子类来使用,为什么将Task放入Thread文件夹,而EchoTask和WorkTask这两个子类放入Task文件夹,因为Task类是一个无差异的类,作为纯虚基类不实现run和destroy这些方法,而是用于存储Task任务执行时所需要的一些必要的数据和变量,且Task类将与TaskQueue类,ThreadPool类一起来形成线程池的内容。因此将其放入Thread文件夹中,而 EchoTask和WorkTask这两个子类中的都是具有差异化的内容。

C++ 实现简易的 sqlserver_第18张图片

TaskQueue这个类用于实现Task任务的管理,主要使用到add_task,get_task,以及Task_number这些功能,用于获取任务,添加任务,以及获取任务总数(用于ThreadPool线程池来管理线程数量) 

C++ 实现简易的 sqlserver_第19张图片 ThreadPool线程池,manager函数用于动态管理线程池中线程数量,work函数用于取出TaskQueue队列中的Task来执行,以及一些alive_num,busy_num等成员变量用于管理ThreadPool线程池的运行

小tips:在使用std::thread 的时候,传入callback功能函数,并依次传入callback的参数即可,下面是thread的构造函数

template  
explicit thread (Fn&& fn, Args&&... args); 

待完善。。。

你可能感兴趣的:(java,jvm,数据库)