02 连接池中每一个Connection的功能实现

本文介绍了如何使用MySQLCAPI进行数据库连接的初始化、释放,以及执行更新和查询操作。通过`mysql_init()`和`mysql_real_connect()`建立连接,`mysql_close()`释放资源。同时,文章提到了使用`mysql_query()`执行SQL语句,并利用编译器宏记录日志信息,还讨论了连接存活时间和连接池管理的概念。
摘要由CSDN通过智能技术生成

         对于池中的每一个连接要求它可以完成连接数据库更新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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值