在C ++中管理全局数据库连接

时间:2012-03-15 22:24:25

标签: c++ database-connection

可以安全地执行以下操作:

我有一个C ++库,可以在不同的点连接到SQL DB。我想在所有这些方面提供全球连接。可以这样做吗?是否存在标准模式。我在考虑将连接存储在单例中。

编辑: 假设我有以下连接接口。

class Connection {
public:
   Connection();
   ~Connection();
   bool isOpen();
   void open();
}

我想实现以下界面:

class GlobalConnection {
public:
    static Connection & getConnection() {
        static Connection conn_;
        if (!conn_.isOpen())
            conn_.open();
        return conn_;
    }
private:
    GlobalConnection() {};
    Connection conn_;
};

我对上述内容有两点疑虑。一个是getConnection不是线程安全的,另一个是我不确定静态资源的破坏。换句话说,我保证连接将关闭(即它的析构函数将被调用)。

对于记录,连接类本身由SQLAPI ++库提供(虽然这不是很相关)。

编辑2:在做了一些研究后,似乎虽然SQLAPI doent直接支持池,但它可用于通过调用启用OD​​BC设施的连接池

 setOption("SQL_ATTR_CONNECTION_POOLING") = SQL_CP_ONE_PER_DRIVER 

文档说明必须在建立第一个连接之前进行此调用。在具有多个潜在呼叫站点的代码中确保打开连接的最佳方法是什么。如果没有发生怎么办?是否会抛出错误或汇集不启用。
还有哪些工具可用于监控DB的打开连接数量?

2 个答案:

答案 0 :(得分:0)

Singleton可以用任何OO语言解决这个问题。在C / C ++中,您还可以使用静态变量(如果您不使用纯OO编码样式)。

答案 1 :(得分:0)

大多数客户端库都支持connection pooling。 所以打开一个新的连接只会从池中选择一个现有的连接。