可以安全地执行以下操作:
我有一个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直接支持池,但它可用于通过调用启用ODBC设施的连接池
setOption("SQL_ATTR_CONNECTION_POOLING") = SQL_CP_ONE_PER_DRIVER
文档说明必须在建立第一个连接之前进行此调用。在具有多个潜在呼叫站点的代码中确保打开连接的最佳方法是什么。如果没有发生怎么办?是否会抛出错误或汇集不启用。
还有哪些工具可用于监控DB的打开连接数量?
答案 0 :(得分:0)
Singleton可以用任何OO语言解决这个问题。在C / C ++中,您还可以使用静态变量(如果您不使用纯OO编码样式)。
答案 1 :(得分:0)
大多数客户端库都支持connection pooling。 所以打开一个新的连接只会从池中选择一个现有的连接。