2013-12-09 92 views
0

我正致力於保護我的項目中的數據庫訪問對象,該項目使用C++編寫並連接到MySQL(使用MySQL C API)。數據庫訪問對象設計模式

該項目是運行24x7的服務器端應用程序。

我需要的保護是在每次操作之前確保數據庫連接是健康的。如果DAO與數據庫斷開連接或連接超時,我將不得不暫停操作並等待重新連接成功。

我目前的設計是:

class DAO 
{ 
public: 
    int Conn(string svr, string port, string usr, string pwd, string schema); 
    int Close(); 

    // Methods for database manipulation 
    int QueryXXX(...); 
    int InsertYYY(...); 
    int UpdateZZZ (...); 

private: 
    MYSQL* m_conn; 
} 

(我儘量讓在這裏簡單)
(而對於每一個新的功能,操作新的數據,我只需添加更多的方法吧。)

基於上述設計,我將不得不在每個方法的開始都添加檢查代碼,並且我需要提醒自己和其他開發人員在將來的每個新方法中添加相同的代碼。

有沒有更好的解決方案,而不是複製相同的代碼(或調用相同的功能)在凝視每一個單一的方法?

謝謝!

回答

1

下面是一個選項:不是將連接驗證邏輯放在DAO類中,而是將它移入一個封裝了MYSQL指針的單獨類中。因此,像:

class DAO { 
    public: 
     ... 
    private: 
     MyMYSQLHandleAccessWrapper m_conn; 
}; 

class MyMYSQLHandleAccessWrapper { 
    public: 
     ... 
     MYSQL* GetHandle() { 
      // TODO: place verification logic here 
      return m_conn; 
     }; 
     ... 
    private: 
     ... 
     MYSQL* m_conn; 
}; 

現在,這會直接訪問m_connDAO邏輯將訪問m_conn.GetHandle(),它可以實現連接邏輯。所以,例如而不是QueryXXX看起來像:

DAO::QueryXXX(...) { 
    check_connection(..); 
    do_stuff_with_mysql(m_conn); 
} 

你必須:

DAO::QueryXXX(...) { 
    MYSQL* mysql = m_conn.GetHandle(); 
    do_stuff_with_mysql(mysql); 
} 

這沒有什麼不同,但強制的功能,如QueryXXX實施者通過要求之前GetHandle調用調用連接邏輯能夠對底層的MYSQL API做任何事情。

+0

好主意!謝謝!! – LennonLam