【问题标题】:postgres connection pooling librarypostgres 连接池库
【发布时间】:2011-06-28 14:25:20
【问题描述】:

是否有任何 C/C++ 库可用于 postgres 连接池?我看过 pgpool 更像是一个中间件。我正在寻找一个可以编码到我的应用程序中的库。

【问题讨论】:

  • 澄清一下,您正在寻找可以维护与一个或多个数据库的连接列表的东西?最简单的答案是使用PGconn * 的数组。也许您应该更具体地了解您需要什么,因为连接池传统上确实指的是中间件。
  • 是的,我正在寻找那个。我正在考虑类似 Apache DBCP 的 java 。配置池后,我不必担心检查连接的健康状况、关闭断开的连接等。池应该透明地管理所有这些并提供干净的 API。

标签: c postgresql connection pooling


【解决方案1】:

没有一个好的应用内连接池库。几乎整个社区都使用外部代理,尤其是 pgbouncer,因为它具有额外的运营优势。同样,SOCI has a connection pool,但它的使用范围远不如pgbouncer

【讨论】:

  • 我想找到一个无需在我的服务器中引入任何新服务/流程的解决方案。看起来我必须编写自己的池化库。顺便说一句,对使用SQL Relay有什么建议吗?
【解决方案2】:

你看过libpqxx了吗?它本身不是一个连接池,但是它提供了一个 c++ API 来从应用程序代码中抽象连接处理。这允许应用非常轻松地构建和管理自己的连接池。

真的很简单,这里有一个例子(使用boost for shared_ptr & pqxx)来说明一个池类,带有工厂方法。您可以想象 runQuery 方法将从指定的池中获取连接,并调用 pqxx API 以在底层连接上执行查询。然后它可以将连接返回到池。

class DbPool {
public:
    static db_handle_t create(const string &conn,
                              uint32_t max = DEFAULT_CON_MAX,
                              uint32_t min = DEFAULT_CON_MIN);

    static pqxx::result runQuery(db_handle_t pool,
                                 const string& query);

private:

    DbPool(const string& con, uint32_t max_cons,
           uint32_t min_cons);

    static boost::ptr_vector<DbPool> pool_;  // Keep a static vector of pools,

    pqxx::connection *createCon();
    void              releaseCon(pqxx::connection *c);
    uint32_t          initializeCons();
    pqxx::connection *getCon();

    boost::ptr_list<pqxx::connection> m_freeCons;

}

【讨论】:

  • 很好的答案,但您是否也不必管理连接,例如防止它们干扰彼此的查询?我不熟悉 Postgres,因此不知道它是否已经自动管理。
猜你喜欢
  • 2021-10-05
  • 2017-10-31
  • 1970-01-01
  • 2012-12-18
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多