以下是一个简单的C++ MySQL连接池示例:
#include <mysql/mysql.h>
#include <iostream>
#include <queue>
#include <mutex>
#define DB_HOST "localhost"
#define DB_USER "username"
#define DB_PASS "password"
#define DB_NAME "mydatabase"
class ConnectionPool {
private:
std::queue<MYSQL*> connection_queue;
std::mutex mtx;
public:
ConnectionPool(int size) {
for (int i = 0; i < size; i++) {
MYSQL* conn = mysql_init(NULL);
if (conn != NULL && mysql_real_connect(conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0)) {
connection_queue.push(conn);
} else {
// 处理连接错误
std::cerr << "Failed to connect to database: " << mysql_error(conn) << std::endl;
if (conn != NULL) {
mysql_close(conn);
}
}
}
}
~ConnectionPool() {
while (!connection_queue.empty()) {
MYSQL* conn = connection_queue.front();
connection_queue.pop();
mysql_close(conn);
}
}
MYSQL* getConnection() {
std::lock_guard<std::mutex> lock(mtx);
if (!connection_queue.empty()) {
MYSQL* conn = connection_queue.front();
connection_queue.pop();
return conn;
}
return nullptr;
}
void releaseConnection(MYSQL* conn) {
std::lock_guard<std::mutex> lock(mtx);
if (conn != nullptr) {
connection_queue.push(conn);
}
}
};
int main() {
// 创建一个包含5个连接的连接池
ConnectionPool pool(5);
// 获取连接
MYSQL* conn1 = pool.getConnection();
if (conn1 != nullptr) {
// 使用连接进行数据库操作
// ...
// 释放连接
pool.releaseConnection(conn1);
}
// 获取另一个连接
MYSQL* conn2 = pool.getConnection();
if (conn2 != nullptr) {
// 使用连接进行数据库操作
// ...
// 释放连接
pool.releaseConnection(conn2);
}
return 0;
}
这个示例使用了C++的标准库容器queue
和互斥锁mutex
来实现MySQL连接池。在构造函数中,它创建了指定数量的MySQL连接,并将其添加到队列中。getConnection()
方法用于获取可用的连接,如果队列不为空,则从队列中取出一个连接并返回;否则返回空指针。releaseConnection()
方法用于将使用完毕的连接放回队列。
需要注意的是,你需要在编译时链接MySQL C++库(例如加入 -lmysqlclient
参数)。同时,请根据实际情况修改代码中的数据库主机名、用户名、密码和数据库名称,并进行适当的错误处理。
此示例仅提供了基本的功能,实际应用中可能需要添加更多功能以满足具体需求,比如设置最大连接数限制、超时处理等。
希望这个示例能够帮助你开始构建自己的C/C++ MySQL连接池。
内容由零声教学AI助手提供,问题来源于学员提问