数据库连接池概述我们在进行数据库操作的时候为了提高数据库(关系型数据库)的访问瓶颈,除了在服务器端增加缓存服务器(例如redis)缓存常用的数据之外,还可以增加连接池,来提高数据库服务器的访问效率。
一般来说,对于数据库操作都是在访问数据库的时候创建连接,访问完毕断开连接。但是如果在高并发情况下,有些需要频繁处理的操作就会消耗很多的资源和时间,比如:
建立通信连接的TCP三次握手
数据库服务器的连接认证
数据库服务器关闭连接时的资源回收
断开通信连接的TCP四次挥手
如果使用数据库连接池会减少这一部分的性能损耗。
接下来会基于MySql数据库(使用MySQL的API连接MySQL数据库)为大家讲解一下,如何使用C++11的相关新特性来实现一个数据库连接池。
涉及的技术点
C++11 新特性
多线程编程
线程同步(互斥锁的使用)
处理时间和日期的 chrono 库
条件变量
智能指针
lambda 表达式
使用 =delete 删除函数
其它知识点
MySQL 数据库编程,主要是官方 API 的封装和使用
MySQL API 详解
单例模式
STL容器
生产 ...
连接数据库的步骤众所周知,MySQL数据库是一个典型的C/S结构,即:客户端和服务器端。如果我们部署好了MySQL服务器,想要在客户端访问服务器端的数据,在编写程序的时候就可以通过官方提供的C语言的API来实现。
在程序中连接MySql服务器,主要分为已经几个步骤:
初始化连接环境
连接mysql的服务器,需要提供如下连接数据:
服务器的IP地址
服务器监听的端口(默认端口是3306)
连接服务器使用的用户名(默认是 root),和这个用户对应的密码
要操作的数据库的名字
连接已经建立, 后续操作就是对数据库数据的添删查改
这些操作都是需要通过sql语句来完成的
数据查询:通过调用api 执行一个查询的sql语句
数据修改(添加/删除/更新):通过调用api 执行一个修改数据的sql语句
如果要进行数据 添加/ 删除/ 更新,需要进行事务的处理
需要对执行的结果进行判断
成功:提交事务
失败:数据回滚
数据库的读操作 -> 查询 -> 得到结果集
遍历结果集 -> 得到了要查询的数据 ...
1. 数组所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。
数组是一个有序的列表,可以在数组中存放任意的数据,并且数组的长度可以动态的调整。
通过数组字面量创建数组
1234567891011// 创建一个空数组var arr1 = []; // 创建一个包含3个数值的数组,多个数组项以逗号隔开var arr2 = [1, 3, 4]; // 创建一个包含2个字符串的数组var arr3 = ['a', 'c']; // 可以通过数组的length属性获取数组的长度console.log(arr3.length);// 可以设置length属性改变数组中元素的个数arr3.length = 0;
1.1 获取数组元素数组的取值
123456// 格式:数组名[下标] 下标又称索引// 功能:获取数组对应下标的那个值,如果下标不存在,则返回undefined。var arr = ['red', 'green', 'blue'];arr ...
1. 运算符1.1 算术运算符Javascript中支持的算术运算符有五种,分别为:
+:加号
-:减号
*:乘号
/:除号
%:取余
1.2 一元运算符一元运算符:只有一个操作数的运算符。
前置 ++ / - -
前置++:先加1,后参与运算
前置- - :先减1,后参与运算
后置 ++ / - -
后置++:先参与运算,后加1
后置- - :先参与运算,后减1
12345var iNum1 = 10;var iNum2 = 20;var iNum3 = --iNum1 + --iNum2; // 9 + 19 等于 28var iNum4 = iNum1-- + iNum2--; // 9 + 19 等于 28var iNum5 = iNum1 + iNum2; // 8 + 18 等于 26
1.3 逻辑运算符逻辑运算符又叫布尔运算符,逻辑运算符参与的表达式返回一个布尔类型的值。Javascript中的逻辑运算符和C/C++中的逻辑运算符是一样的。
&&:逻辑与,两个操作数同时为true,结果为 ...
1. JavaScript 概述JavaScript是一种运行在客户端 的脚本语言(不需要编译,直接执行)。JavaScript的解释器被称为JavaScript引擎,为浏览器的一部分,是广泛用于客户端的脚本语言,它一般是在HTML网页上使用,用来给HTML网页增加动态功能。
JavaScript和HTML、CSS的区别
HTML:提供网页的结构,提供网页中的内容
CSS: 用来美化网页
JavaScript: 可以用来控制网页内容,给网页增加动态的效果
JavaScript 分三个部分
ECMAScript
JavaScript的核心,描述了语言的基本语法和数据类型,ECMAScript是一套标准,定义了一种语言的标准与语法规范。
DOM---Document Object Model 文档对象模型
一套操作页面元素的API,DOM可以把HTML看做是文档树,通过DOM提供的API可以对树上的节点进行操作。
BOM---Browser Object Model 浏览器对象模型
一套操作浏览器功能的API,通过BOM可以操作浏览器窗口,比如:弹出框、控制浏览器跳 ...
很多人不了解Qt Quick和Qml,还有很多人对其存在偏见。这篇文章就是来向这些有困惑的人介绍一下其是什么,有什么特点。
首先,这两个是一个东西吗?答案:是的。但是,具体来说,Qt Quick是框架,qml是语言。Qt Quick是用C++搭建起来的一套DirectUI/Immediate UI框架,在这个框架上可以用和js语法一样的qml语言开发界面。
和原来的QWidgets框架有什么关系吗?答案是没有。这个估计让很多人失望,我一开始也是以为Qt Quick就是QWidgets的演进版,只不过用js替代了原有的ui.xml文件。实际上,Qt Quick是一个新框架,它仅仅继承了QT原有的元对象系统,也就带信号槽的对象系统,其他的理念都是新的。了解DirectUI的同学肯定知道DirectUI和经典的GUI库,如MFC、WTL的区别。DirectUI把所有控件都在一个主窗口的绘制事件里绘制,从硬件原理上说就是界面是统一刷新的,而不是根据事件选择部分区域刷新。这样的好处是这些控件容易协作变化,特别适合制作动态界面,例如控件拖拽、变形、变色、皮肤、透明、3D等等。
为什么要引 ...
在前面的文章中为大家介绍了C语言中如何使用cjson处理json数据,接下来讲一下json在C++中的处理,这里给大家介绍一个开源的库jsoncpp。
1. 下载和编译1.1 下载下载 jsoncppJsoncpp是个跨平台的C++开源库,提供的类为我们提供了很便捷的操作,而且使用的人也很多。在使用之前我们首先要从github仓库下载源码,地址如下:
1https://github.com/open-source-parsers/jsoncpp
下载 cmake 工具由于C++程序猿都是基于VS进行项目开发,下载的源码我们一般不会直接使用,而且将其编译成相应的库文件(动态库或者静态库),这样不论是从使用或者部署的角度来说,操作起来都会更方便一些。
但是,从github下载的源码不能直接通过VS打开,编译就更谈不上了。它提供的默认编译方式是cmake。我们可以通过使用cmake工具将下载的jsoncpp源码生成一个VS项目,这样就可以通过VS编译出需要的库文件了。
CMake工具的官方下载地址如下:
1https://cmake.org/download/
在这最新的安装包,根据 ...
1. 概述Qt框架中对数据库操作提供了很好的支持,我们可以通过Qt提供的类非常方便地和本地或者远程数据库进行连接。众所周知,数据库是 C-S(client-server)结构的,我们要连接的数据库属于服务器端,通过Qt编写的应用程序属于客户端。
如果想用通过Qt访问数据库,首先我们需要在项目中添加数据库模块,模块名为sql 。找到项目文件xxx.pro,把模块名加进去:
1QT += core gui sql
这个sql模块其实对应的就是一个动态库,动态库中有数据库相关类的二进制源码,在使用动态库中的数据库类的时候,动态库被加载到内存,根据程序猿的需求来提供相应的服务。
首先来介绍一下Qt为我们提供的常用的数据库类:
QSqlDatabase :通过这个类添加/删除/复制/关闭数据库实例
QSqlQuery :数据库查询类
QSqlRecord :数据库记录(通常是数据库中表或视图中的一行)的功能和特征。
QSqlField :数据库表或视图中单个列的特征,例如数据类型和列名。
QSqlQueryModel :执行SQL语句和遍历结果集的高级接口。它构建在底层QSqlQuery之上 ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
1. 什么是非受限联合体联合体又叫共用体,我将其称之为union,它的使用方式和结构体类似,程序猿可以在联合体内部定义多种不同类型的数据成员,但是这些数据会共享同一块内存空间(也就是如果对多个数据成员同时赋值会发生数据的覆盖)。在某些特定的场景下,通过这种特殊的数据结构我们就可以实现内存的复用,从而达到节省内存空间的目的。
在C++11之前我们使用的联合体是有局限性的,主要有以下三点:
不允许联合体拥有非POD类型的成员
不允许联合体拥有静态成员
不允许联合体拥有引用类型的成员
在新的C++11标准中,取消了关于联合体对于数据成员类型的限定,规定任何非引用类型都可以成为联合体的数据成员,这样的联合体称之为非受限联合体(Unrestricted Union)
2. 非受限联合体的使用2.1 静态类型的成员对于非受限联合体来说,静态成员有两种分别是静态成员变量和静态成员函数,我们来看一下下面的代码:
12345678910111213141516171819 ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
1. 枚举1.1 枚举的使用枚举类型是C及C++中一个基本的内置类型,不过也是一个有点”奇怪”的类型。从枚举的本意上来讲,就是要定义一个类别,并穷举同一类别下的个体以供代码中使用。由于枚举来源于C,所以出于设计上的简单的目的,枚举值常常是对应到整型数值的一些名字,比如:
1234// 匿名枚举enum {Red, Green, Blue};// 有名枚举enum Colors{Red, Green, Blue};
在枚举类型中的枚举值编译器会默认从0开始赋值,而后依次向下递增,也就是说Red=0,Green=1,Blue=2。
1.2 枚举的缺陷C/C++的enum有个很”奇怪” 的设定,就是具名(有名字)的enum类型的名字,以及 enum 的成员的名字都是全局可见的。这与 C++中具名的 namespace、class/struct 及 union 必须通过名字::成员名的方式访问相比是格格不入 ...