Я работаю над защитой объекта доступа к базе данных в моем проекте, который написан на 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;
}
(Я пытаюсь сделать это просто здесь)
(И для каждой новой функции, манипулирующей новыми данными, я просто добавляю к ней больше методов.)
Исходя из вышеизложенного, мне нужно будет добавлять проверочный код в начале каждого метода, и мне нужно напомнить себе и другим разработчикам, что в будущем необходимо добавлять один и тот же код в каждый новый метод.
Есть ли лучшее решение, чем копировать один и тот же код (или вызывать одну и ту же функцию) при запуске каждого метода?
Спасибо!
Вот один из вариантов: вместо размещения логики проверки соединения в 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.
Других решений пока нет …