Шаблон дизайна объекта доступа к базе данных

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

Проект представляет собой серверное приложение, работающее 24×7.

Мне нужна защита, чтобы убедиться, что соединение с базой данных исправно перед каждой операцией. Если 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;
}

(Я пытаюсь сделать это просто здесь)
(И для каждой новой функции, манипулирующей новыми данными, я просто добавляю к ней больше методов.)

Исходя из вышеизложенного, мне нужно будет добавлять проверочный код в начале каждого метода, и мне нужно напомнить себе и другим разработчикам, что в будущем необходимо добавлять один и тот же код в каждый новый метод.

Есть ли лучшее решение, чем копировать один и тот же код (или вызывать одну и ту же функцию) при запуске каждого метода?

Спасибо!

0

Решение

Вот один из вариантов: вместо размещения логики проверки соединения в 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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector