首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Libpqxx连接池

Libpqxx连接池
EN

Stack Overflow用户
提问于 2012-09-21 17:51:31
回答 2查看 4.9K关注 0票数 4

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

编辑:我设法修复了所有的编译错误。当我运行main函数时,它给了我一个分段错误。

代码语言:javascript
复制
class DbPool {

公共:

代码语言:javascript
复制
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));
    }
}

私有:

代码语言:javascript
复制
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;

};

代码语言:javascript
复制
int main(int argc, char *argv[]) {
     DbPool *pool = new DbPool(5);
     result res = pool->runQuery("SELECT COUNT (*) from captures");
     return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2012-09-21 18:00:29

如果你担心设计问题,这里是我的5分钱:

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

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

代码语言:javascript
复制
connection * createCon(){

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

代码语言:javascript
复制
    connection* con = createCon();
    m_freeCons.push_back(shared_ptr<connection>(con));

在其他地方也是如此。

票数 2
EN

Stack Overflow用户

发布于 2016-01-02 03:41:48

受你的帖子的启发,我在我自己的项目中使用了这个简单的连接池。我使用std::stack。推送和弹出。除了在添加连接时使用try-catch外,不进行错误检查。对于postgresql-db。

Database.hpp:

代码语言:javascript
复制
#include <stack>
#include <pqxx/pqxx>

class Database {
private:
    const std::string connectionString = "dbname=db user=usr hostaddr=127.0.0.1 port=5432";
    std::stack<pqxx::connection *> dbpool;

public:
    Database(const unsigned int);

Database.cpp:

代码语言:javascript
复制
#include "Database.hpp"

Database::Database(const unsigned int connections) {
    for (int i = 0; i < connections; ++i) {
        try {
            auto* dbconn = new pqxx::connection(connectionString);
            dbpool.emplace(dbconn);
        } catch (const std::exception& e) {
            std::cerr << e.what() << std::endl;
        }
    }
}

main.cpp:

代码语言:javascript
复制
#include "Database.hpp"

int main(int argc, char* argv[]) {
    Database database {10};

    auto *D = dbpool.top();
    dbpool.pop();

    const std::string query = "select * from mytable";
    pqxx::nontransaction N(*D);
    pqxx::result R(N.exec(query));

    for (pqxx::result::const_iterator c = R.begin(); c != R.end(); ++c) {
        std::cout << c[1].as<std::string>() << std::endl;
    };

    dbpool.push(D);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12528199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档