2013-12-09 2 views
0

Я работаю над защитой объекта доступа к базе данных в моем проекте, который написан на C++ и подключен к MySQL (с использованием API MySQL C).Шаблон проектирования объекта доступа к базам данных

Проект представляет собой серверное приложение, работающее 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; 
}; 

Теперь логика в 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 перед будучи в состоянии сделать что-либо с базовым API MYSQL.

+0

Хорошая идея! Благодаря!! – LennonLam

Смежные вопросы