Libzdb源码解读

news/2024/7/10 21:00:02 标签: 开源, 数据库连接池, 设计模式

<pre name="code" class="cpp" style="text-align: center; font-size: 24px; font-weight: bold;">Libzdb源码解读

 

1  Libzdb简介

一个非常小,简单的数据库连接池库。

1.1  Libzdb特点

1) 线程安全。

2) 连接不同的数据库系统。

3) 零运行时配置,连接使用URL。

4) 目前支持的数据库MySQL, PostgreSQL, SQLite and Oracle。

5) 可以不断进行扩展。

1.2  支持平台及开发语言

1.2.1  OS

支持ios、Linux、FreeBSD、Solaris、OpenBSD和其他 POSIX 系统。

1.2.2  语言

C、C++、Object C

2  Libzdb技术框架

2.1  数据库连接池

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

2.2  线程安全

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

2.3  设计模式之代理模式

2.3.1简介

为其他对象提供一种代理以控制对这个对象(过程化中,可以考虑一下特殊的接口,如数据库API接口)的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

2.3.2  优点

1)职责清晰

真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

2)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。

3)高扩展性,假如引入其他数据库。

2.3.3  代理模式实例

在公司上网的时候,并不是每一台PC都有上网的权限的。比如说,现在有PC1、PC2、PC3,但是只有PC1有上网权限,但是PC2、PC3也想上网,此时应该怎么办呢?

此时,我们需要做的就是在PC1上开启代理软件,同时把PC2、PC3的IE代理指向PC1即可。这个时候,如果PC2或者PC3想上网,那么报文会先指向PC1,然后PC1把Internet传回的报文再发给PC2或者PC3。这样一个代理的过程就完成了整个的上网过程。

#include <stdio.h>
#include <assert.h>
#include <sdlib.h>
typedef struct _PcClient
{
     void (*request)();
}PcClient;

void ftp_request()  
{
     printf("request from ftp!\n");  
}  

void http_request()  
{  
     printf("request from http!\n");  
}  

void smtp_request()  
{  
     printf("request from smtp!\n");  
}  

typedef struct _Proxy  
{  
     PcClient* pClient;  
}Proxy;  

void process(Proxy* pProxy)  
{  
     assert(NULL != pProxy);  
     pProxy->pClient->request();  
}  

/* test programe*/
int main()
{
    PcClient *pc = (PcClient *)malloc(sizeof(PcClient));
    if(pc == NULL)
    {
          printf("malloc fail\n");
          return 0;      
    }
    Proxy *pProxy = (Proxy *)malloc(sizeof(Proxy));
    if(pProxy == NULL)
    {
          printf("malloc fail\n");
          return 0;      
    }
    pc->request = &http_request;
    pProxy->pClient = pc;
    process(pProxy); 
    return 0;
}

2.4  各类数据库开发API

2.4.1  关系数据库

    MYSQL

    ORALCE    OCI

    SQLITE

2.5  模块化设计

要编写复杂软件又不至于一败涂地的唯一方法,就是用定义清晰的接口把若干简单模块组合起来,如此一来,多数问题只会出现在局部,那么还有希望对局部进行改进或优化,而不至于牵动全身。(参考Unix编程艺术)

3  Libzdb使用场景

要使系统兼容各类数据库、多进程等。

4  Libzdb源码结构


4.1  各模块简单分析

4.1.1  Exception

异常模块,主要是为整个系统提供异常处理接口。处理异常包括数据库异常和内存异常等其他非法操作。捕获异常的好处是,不使程序由于异常而非法退出。

4.1.2  System

一些时间处理、内存操作、系统操作等接口。方便其他模块调用。

4.1.3  Net

统一资源定位符(UniformResource Locator,缩写为URL)是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

整个数据库的初始化和代理对象的初始化,都是通过这个URL来进行处理。

示例:

mysql://localhost:3306/test?user=root&password=swordfish

    这个模块式针对这个URL地址进行处理的函数接口。

4.1.4  Util

    这个模块主要负责一些工具的封装,封装了字符串的处理函数,还封装了面向对象中的向量(vector)、StringBuffer等工具,方面整个模块的处理。

4.1.5  Db

    这个模块主要包括实现连接代理模式、结果集代理模式、SQL语句代理模式和数据库连接池、各类数据库连接的真实实现等。这个模块是整个程序的核心。

    主题代码实现细节,各位可以网上下载,自行阅读。

5、结束语

    这是第一次写博文,写得错误的还望各位见谅!希望以上能对想了解这方便的人有所帮助。了解更多的内容(http://www.tildeslash.com/libzdb/#),后期也会补充博文。


http://www.niftyadmin.cn/n/1460649.html

相关文章

Centos8重启网络服务

nmcli c up ens33 nmcli d reapply ens33 nmcli d connect ens33 这里的ens33是你的网卡的名称&#xff0c;可以在 /etc/sysconfig/network-scripts 路径下的配置文件中查询&#xff0c;我的路径下面就一个文件&#xff1a;ifcfg-ens33&#xff0c;里面的内容&#xff1a; …

qt mysql update_Qt: 数据库操作;

QT的数据库操作有两种方式&#xff1a; 一) 使用QsqlTableModel类&#xff0c; 可以配合QTableView进行界面显示并进行数据库操作&#xff0c;这种方法比较方便快捷&#xff1b; 二) 使用原始SQL语言&#xff0c; 利用INSERT, UPDATE, SELECT, DELETE实现插入&#xff0c;更新…

安装oracle数据库后遇到数据入库为乱码的问题-由于oracle编码和系统编码不同导致

在项目中安装oracle数据库后遇到数据入库为乱码的问题。 0x01 背景知识&#xff1a;下表是locale ID与字符集名称的对应关系&#xff1a;Language Locale ID NLS_LANG English (American) en_US.UTF-8 AMERICAN_AMERICA.AL32UTF8 English (American) en_US.ISO-8859-1 …

mysql binlog解析 c_mysql binlog格式解析(一)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼参考源&#xff1a;1、源码log_event.h log_event.cc pack.c2、internals-en.epub一、目的本系列文件主要为了说明1、为什么说row格式较statement更占空间2、为什么说row格式的binlog更加安全3、INSERT/UPDATE/DELETE是生成的row b…

mysql至少选修了两门课程_mysql基础(二)之练习题

2、查询“生物”课程比“物理”课程成绩高的所有学生的学号&#xff1b;select A.student_id from(select student_id,num from score left join course on score.course_id course.cid where cname生物) as Ainner join(select student_id,num from score left join course o…

linzdb的应用

0x01 背景前段时间(也许是去年了吧)已经大概介绍了libzdb开源数据库连接池。后期在项目中应用过程中也遇到了一些问题&#xff0c;下面把一些应用场景和遇到的问题简单的说一下&#xff0c;希望对大家有帮助&#xff1a;0x02 应用场景linux C程序读写数据库&#xff0c;利用开源…

Linux解决 -bash: nc: command not found问题

问题: [hadoop@hadoop001 conf]$ nc -lk 9999 -bash: nc: command not found 1 2 从提示信息中我们可以知道,是由于nc命令无法被找到 没有配置nc的命令 解决: [root@hadoop001 ~]# yum install -y nc [root@hadoop001 ~]# yum install -y nc Loaded plugins: fastestmirror…

linux下借助图形界面操作mysql数据库

0x01缘起 最近总是觉得自己碌碌无为&#xff0c;于是想利用一些开源的东西做一个属于自己的应用&#xff0c;也不枉做一会程序员。 在linux平台下用命令行操作数据库时一件比较痛苦的事&#xff0c;于是想利用一下图形界面&#xff0c;提供开发效率。在网上找了一些工具&#…