数据库访问对象设计模式

时间:2013-12-09 02:31:39

标签: c++ mysql database dao

我正在保护我项目中的数据库访问对象,该对象是用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 个答案:

答案 0 :(得分: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;
};

现在,DAO中可直接访问m_conn的逻辑将访问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这样的函数的实现者通过在能够对底层MYSQL API做任何事情之前要求调用GetHandle来调用连接逻辑。