【问题标题】:Database access object design pattern数据库访问对象设计模式
【发布时间】:2013-12-09 02:31:39
【问题描述】:

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

(我在这里尽量简化)
(对于每一个处理新数据的新功能,我只是简单地添加更多方法。) p>

基于上述设计,我将不得不在每个方法的开头添加检查代码,并且我需要提醒自己和其他开发人员将来在每个新方法中添加相同的代码。

有没有比在每个方法开始时复制相同的代码(或调用相同的函数)更好的解决方案?

谢谢!

【问题讨论】:

    标签: c++ mysql database dao


    【解决方案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 这样的函数的实现者通过调用GetHandle 来调用连接逻辑,然后才能对底层MYSQL API 执行任何操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2015-02-27
      相关资源
      最近更新 更多