# 数据库连接池

# 数据库连接池概述

提高数据库的访问瓶颈(关系型数据库):

  1. 缓存服务器 Redis
  2. 数据库连接池

一般而言,对于数据库操作都是在访问的时候创建连接,访问完毕之后断开连接。在高并发的情况下,频繁的连接创建和释放会有很大的开销。需要进行如下过程:

  1. 建立通信的连接 TCP 三次握手
  2. 数据库服务器的连接认证
  3. 关闭数据库连接时资源是释放
  4. 断开通信连接 TCP 四次挥手

# MySQL API

# mysql_init

MYSQL *mysql_init(MYSQL *mysql);

# mysql_real_connect

MYSQL *mysql_real_connect(
	MYSQL *mysql,				//mysql_init () 函数的返回值
    const char *host,			 //mysql 服务器的 IP 地址
    const char *user, 			 //mysql 服务器的用户名
    const char *password, 	      //mysql 服务器用户对应的密码
    const char *db,				 // 数据库名
    unsigned int port,			 //mysql 服务器的监听端口
    const char *unix_socket,
    unsigned long client_flag	
);
/*
返回值:
	成功:返回有效的 MYSQL 连接句柄
	失败:NULL
	句柄:一个实例 / 对象
*/

# mysql_query

int mysql_query(MYSQL *mysql, const char*query);
/*
返回值:
	成功:返回 0,同时查询结果(结构集)存储在 mysql 句柄中
	失败:返回非 0
*/

# mysql store_result

MYSQL_RES *mysql_store_result(MYSQL *mysql);
/*
返回值:
	成功:返回结果集
	失败:返回 NULL
*/

# mysql_num_fields

//  获取结果集中的列数
unsigned int mysql_num_fields(MYSQL_RES *result);

# mysql_fetch_fields

//  获取结果集的列名
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result);

MYSQL_FIELD 对应的结构体定义在 mysql.h 文件中,定义如下:

// mysql.h
typedef struct st_mysql_field{
    char *name;				
    ...
}MYSQL_FIELD;

# mysql_fetch_lengths

// 返回结果集内
unsigned long *mysql_fetch_lengths(MYSQL_RES *result);

# mysql_fetch_row

typedef char **MYSQL_ROW;
// 取出结果集中的下一行记录(每调用一次,当前的记录会被弹出)
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/*
返回值:
	成功:得到
	失败:返回 NULL
*/

# 遍历结果集

MYSQL_FIELD *fields = mysql_fetch_fields(res);
int length = mysql_num_fields(res);

# mysql_free_result

// 释放结果集对应的内存空间
void mysql_free_result(MYSQL_RES *result);

# mysql_close

// 关闭数据库连接实例,释放 mysql_init () 申请得到的空间
void mysql_close(MYSQL* mysql);

# 字符编码设置

// 获取当前连接默认的字符集
const char *mysql_character_set_name(MYSQL* mysql);
// 设置编码集
int mysql_set_charater_set(MYSQL* mysql, char *character_name);

# 事务操作

// 设置数据库的提交方式(自动提交 mode:true、手动提交 mode:false)
my_bool mysql_autocommit(MYSQL* mysql, my_bool mode);
/*
返回值:
	成功:true
	失败:false
*/
// 提交事务
my_bool mysql_commit(MYSQL *mysql);
/*
返回值:
	成功:true
	失败:false
*/
// 事务回滚
my_bool mysql_rollback(MYSQL *mysql);
/*
返回值:
	成功:true
	失败:false
*/

# 获取错误信息

const char *mysql_error(MYSQL* mysql);
unsigned int mysql_errno(MYSQL* mysql);

# 数据库连接池实现

  • 数据库连接类