对于池中的每一个连接要求它可以完成连接数据库、更新updata、查询select功能;以及记录一下当前连接的连接起始时间、和存活时间方便连接的释放和返回连接池操作。
1. 初始化和释放数据库连接:
mysql_init()
: 这个函数用于初始化一个 MySQL 连接对象,返回一个指向MYSQL
结构体的指针。
mysql_close()
: 这个函数用于关闭一个已打开的 MySQL 连接并释放相关资源。
2. 连接数据库:
mysql_real_connect()用于建立与 MySQL 服务器的连接。
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag);
mysql
: 指向一个已经初始化的MYSQL
结构体指针,用于存储连接对象。host
: MySQL 服务器的主机名或 IP 地址。user
: 连接 MySQL 服务器所使用的用户名。passwd
: 连接 MySQL 服务器所使用的密码。db
: 要连接的数据库名。port
: MySQL 服务器的端口号。unix_socket
: UNIX 套接字文件路径,如果使用 TCP/IP 连接则传入NULL
。client_flag
: 客户端连接选项,如设置字符集、SSL 加密等。连接成功返回连接对象指针,失败返回NULL。
3. 打印日志信息
__FILE__
、__LINE__
和__TIMESTAMP__
,它们是编译器提供的特殊宏,会在编译过程中被替换为相应的值:
__FILE__
:代表当前源文件的文件名。__LINE__
:代表当前代码行的行号。__TIMESTAMP__
:代表代码编译时的时间戳。//日志信息 编译器内置的宏 #define LOG(str) \ cout << __FILE__ << ":" << __LINE__ << " " << \ __TIMESTAMP__ << " : " << str << endl;
4. 更新操作和查询操作
mysql_query()
是 MySQL C API 中的一个函数,用于执行 SQL 查询语句int mysql_query(MYSQL *mysql, const char *query);
mysql
:指向一个已经建立连接的MYSQL
结构体指针。query
:要执行的 SQL 查询语句,以 C 字符串的形式传入。
总体代码:
Connection.h #pragma once #include <mysql.h> #include <string> #include <ctime> using namespace std; /* 实现MySQL数据库的操作 */ class Connection { public: // 初始化数据库连接 Connection(); // 释放数据库连接资源 ~Connection(); // 连接数据库 (ip,端口, 用户名, 密码, 数据库) bool connect(string ip, unsigned short port, string user, string password, string dbname); // 更新操作 insert、delete、update bool update(string sql); // 查询操作 select MYSQL_RES* query(string sql); // 刷新一下连接的起始的空闲时间点 void refreshAliveTime() { _alivetime = clock(); } // 返回存活的时间 clock_t getAliveeTime()const { return clock() - _alivetime; } private: MYSQL* _conn; // 表示和MySQL Server的一条连接 clock_t _alivetime; // 记录进入空闲状态后的起始存活时间 };
Connection.cpp
#include "pch.h" #include "public.h" #include "Connection.h" #include <iostream> using namespace std; Connection::Connection() { // 初始化数据库连接 _conn = mysql_init(nullptr); } Connection::~Connection() { // 释放数据库连接资源 if (_conn != nullptr) mysql_close(_conn); } //(ip,端口, 用户名, 密码, 数据库) bool Connection::connect(string ip, unsigned short port, string username, string password, string dbname) { // 连接数据库 MYSQL* p = mysql_real_connect(_conn, ip.c_str(), username.c_str(), password.c_str(), dbname.c_str(), port, nullptr, 0); return p != nullptr; } bool Connection::update(string sql) { // 更新操作 insert、delete、update if (mysql_query(_conn, sql.c_str())) { LOG("更新失败:" + sql); return false; } return true; } MYSQL_RES* Connection::query(string sql) { // 查询操作 select if (mysql_query(_conn, sql.c_str())) { LOG("查询失败:" + sql); return nullptr; } return mysql_use_result(_conn); }