markparticle / WebServer

C++ Linux WebServer服务器
Apache License 2.0
3.49k stars 730 forks source link

关于httprequest.cpp连接池的使用 #106

Open GREENHSND opened 4 months ago

GREENHSND commented 4 months ago

MYSQL* sql = nullptr; SqlConnRAII(&sql, SqlConnPool::Instance()); 这种声明临时变量的方法明显错误,执行完该句之后就执行析构函数了

wangerforcs commented 4 months ago

MYSQL* sql = nullptr; SqlConnRAII(&sql, SqlConnPool::Instance()); 这种声明临时变量的方法明显错误,执行完该句之后就执行析构函数了

应该是这样吗? SqlConnRAII(&sql, SqlConnPool::Instance());改成创建具名对象SqlConnRAII raii(&sql, SqlConnPool::Instance());的形式,然后删去后面手动释放的SqlConnPool::Instance()->FreeConn(sql);

GREENHSND commented 4 months ago

这样也可以吧,但是不用手动释放吧,RAII这个类的析构函数会释放,另外也可以把RAII这个类删了,在连接池获取连接的接口返回智能指针也可以

std::shared_ptr<MYSQL> SqlConnPool::GetConn() {
    std::shared_ptr<MYSQL> sql_conn;

    std::unique_lock<std::mutex> locker(mtx_);
    if (connQue_.empty()) {
        LOG_WARN("SqlConnPool busy");
        return nullptr;
    }

    MYSQL* sql = connQue_.front();
    connQue_.pop();

    sql_conn.reset(sql, [this](MYSQL* conn) {
        std::lock_guard<std::mutex> locker(mtx_);
        connQue_.push(conn);
        sem_post(&semId_);
    });

    return sql_conn;
}

可以参考一下