2012-03-15 37 views
1

是可以做到安全如下:管理在C全局DB連接++

我有一個連接到SQL數據庫在不同的點一個C++庫。我希望在所有這些點上都有一個全球連接。這可以做到嗎?有這樣的標準模式。我正在考慮以單身存儲連接。

編輯: 假設我有以下連接接口。

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直接支持池可以用來啓用連接通過電話

setOption("SQL_ATTR_CONNECTION_POOLING") = SQL_CP_ONE_PER_DRIVER 

的文檔通過ODBC設施池說,這個調用必須在第一次連接建立之前建立。用多個潛在呼叫站點來打開連接的代碼中保證這一點的最佳方法是什麼?如果這沒有發生?將拋出一個錯誤或池不會被啓用。
還有哪些工具可用於監視數據庫有多少個打開的連接?

+0

如果你打算只有一個全局連接,Singleton模式可能是一個選項。 – user1192525 2012-03-15 22:29:07

回答

0

Singleton可以用任何OO語言解決這個問題。在C/C++中,你也可以使用一個靜態變量(如果你不使用pure-OO編碼風格)。

+1

一個單身人士是一個[反模式](http://accu.org/index.php/journals/337)。但可能是足夠的這種情況 – 2012-03-15 22:32:10

0

大多數客戶端庫支持connection pooling。 所以打開一個新的連接將只從池中選擇一個現有的連接。

+0

謝謝,這將爲我節省了很多麻煩。你碰巧知道如何在SQLAPI ++中啓用它。 – stas 2012-03-16 01:44:25

+0

[看這裏](http://www.sqlapi.com/history.html)這是自2004年以來的功能。(查找SQL_ATTR_CONNECTION_POOLING) – 2012-03-16 08:55:15

+0

另外:大多數庫在默認情況下啓用此功能。 – 2012-03-16 08:58:08