用C++实现一个简单的数据库连接池

D
dashen97 2025-01-07T03:01:12+08:00
0 0 233

数据库连接池是一种常用的技术,用于管理数据库连接,提高应用程序对数据库的性能和并发访问能力。本文将使用C++语言来实现一个简单的数据库连接池。

连接池的设计思路

一个数据库连接池通常具有以下功能:

  1. 初始化连接池,创建初始的数据库连接。
  2. 从连接池中获取一个可用的数据库连接。
  3. 将使用完毕的连接放回连接池中,以供其他请求使用。
  4. 当连接池中没有可用连接时,等待一个可用连接。
  5. 当数据库连接空闲时间过长时,关闭连接。
  6. 可以设置连接池的最大连接数。

基于以上需求,我们可以设计一个简单的数据库连接池类来实现。

实现数据库连接池类

#include <iostream>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <mysql/mysql.h>

class ConnectionPool {
public:
    ConnectionPool(const std::string& url, const std::string& username, const std::string& password, int maxSize);
    ~ConnectionPool();

    MYSQL* getConnection();
    void releaseConnection(MYSQL* connection);

private:
    std::string url_;  // 数据库连接地址
    std::string username_;  // 用户名
    std::string password_;  // 密码
    int maxSize_;  // 连接池最大连接数

    std::queue<MYSQL*> connections_;  // 连接池
    std::mutex mtx_;  // 互斥锁
    std::condition_variable cv_;  // 条件变量

    bool isClosed_;  // 连接池是否已关闭
};

ConnectionPool::ConnectionPool(const std::string& url, const std::string& username, const std::string& password, int maxSize)
    : url_(url), username_(username), password_(password), maxSize_(maxSize), isClosed_(false)
{
    for (int i = 0; i < maxSize_; ++i) {
        MYSQL* connection = new MYSQL;
        mysql_init(connection);
        if (connection != nullptr && mysql_real_connect(connection, url_.c_str(), username_.c_str(), password_.c_str(), nullptr, 0, nullptr, 0) != nullptr) {
            connections_.push(connection);
        } else {
            std::cerr << "Failed to create a database connection." << std::endl;
        }
    }
}

ConnectionPool::~ConnectionPool() {
    isClosed_ = true;
    cv_.notify_all();

    while (!connections_.empty()) {
        MYSQL* connection = connections_.front();
        connections_.pop();
        if (connection != nullptr) {
            mysql_close(connection);
            delete connection;
        }
    }
}

MYSQL* ConnectionPool::getConnection() {
    std::unique_lock<std::mutex> lock(mtx_);
    while (connections_.empty()) {
        if (isClosed_) {
            return nullptr;
        }
        cv_.wait(lock);
    }

    MYSQL* connection = connections_.front();
    connections_.pop();
    return connection;
}

void ConnectionPool::releaseConnection(MYSQL* connection) {
    if (connection != nullptr) {
        std::lock_guard<std::mutex> lock(mtx_);
        connections_.push(connection);
        cv_.notify_one();
    }
}

以上代码实现了一个简单的数据库连接池类,具有初始化连接池,获取连接,释放连接的功能。

使用数据库连接池

使用数据库连接池非常简单,可以按照以下示例代码使用:

int main() {
    std::string url = "localhost";
    std::string username = "root";
    std::string password = "password";
    int maxSize = 10;

    ConnectionPool connectionPool(url, username, password, maxSize);

    // 使用连接池获取连接
    MYSQL* connection = connectionPool.getConnection();
    // 执行数据库操作
    // ...

    // 使用完毕后释放连接
    connectionPool.releaseConnection(connection);

    return 0;
}

以上示例代码演示了如何使用连接池获取连接,并在使用完毕后释放连接。通过连接池管理数据库连接,可以有效提高数据库访问的性能和并发能力。

总结

本文使用C++实现了一个简单的数据库连接池,通过连接池可以方便地管理数据库连接,提高数据库访问的性能和并发能力。当然,这只是一个简单的实现,实际生产环境中可能需要更加完善和复杂的实现。希望本文对你理解和学习数据库连接池有所帮助。

相似文章

    评论 (0)