gpt4 book ai didi

c++ - Libpqxx 连接池

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:23 26 4
gpt4 key购买 nike

我正在尝试使用 libpqxx 库开发一个非常简单直接的连接池。我是 c++ 的新手,对指针和引用仍然很困惑。该类的行为非常简单:有一个带有一些初始化连接的 vector ,并在需要时将连接弹出和推送到 vector 上。由于指针和引用的错误实现,代码有很多错误。你能给我一些提示吗?

编辑:我设法修复了所有编译错误。当我运行主要功能时,它给我一个段错误。

class DbPool {

公共(public):

pqxx::result runQuery(const string& query) {

connection *conn = getCon();
work trans(*conn);
result res = trans.exec(query);
trans.commit();
releaseCon(conn);

return res;
}

DbPool(uint32_t max_cons) {

for (uint32_t i = 0; i < max_cons; i++) {

connection* con = createCon();
m_freeCons.push_back(shared_ptr < connection > (con));
}
}

私有(private):

connection * createCon() {

connection * conn =
new connection(
"user='ak' password='rootpassword' dbname='bips_office' hostaddr='127.0.0.1' port='5432'");
return conn;
}

void releaseCon(connection *con) {

m_freeCons.push_back(shared_ptr < connection > (con));
}

connection* getCon() {

shared_ptr < connection > conn = *(m_freeCons.end() - 1);
m_freeCons.pop_back();
return conn.get();
}

vector<shared_ptr<connection> > m_freeCons;

};

int main(int argc, char *argv[]) {
DbPool *pool = new DbPool(5);
result res = pool->runQuery("SELECT COUNT (*) from captures");
return 0;
}

最佳答案

如果您担心设计问题,这是我的五分钱:

  • 你的代码真的能通过编译吗?我认为不是,因为您有一个指向连接的指针的 vector ,但是您正在推回连接对象(m_freeCons.push_back(*con); - * 取消引用指向连接的指针)...
  • 向成员提供可修改的句柄通常不是一个好主意(就像您在 getCon 方法中所做的那样 - 至少,如果可能的话,返回一个 connection const *
  • 如果您必须使用指针集合,请考虑使用 shared_ptr 而不是原始指针 - 这样您就不必担心释放内存;或使用 Boost.PointerContainer ;另见 here .
  • 只是一个奇怪的风格问题:你为什么使用return &(*conn)?这取消了指针 conn 的引用,然后再次获取它的地址。相反,您可以简单地编写 return conn!

shared_ptr 回答你重写的问题:您仍然需要使用 new 创建连接,并在其周围包装一个 shared_ptr;例如对于 createCon:

connection * createCon(){

connection * conn = new connection("user='ak' password='rootpassword' dbname='bips_office' hostaddr='127.0.0.1' port='5432'");
return conn;
}

    connection* con = createCon();
m_freeCons.push_back(shared_ptr<connection>(con));

在其他地方也类似。

关于c++ - Libpqxx 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com