数据库访问对象设计模式
Database access object design pattern
我正在保护项目中的数据库访问对象,该对象是用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;
}
(我试着在这里让它变得简单(
(对于每个操作新数据的新功能,我只需向其添加更多方法即可。
基于上面的设计,我将不得不在每个方法的开头添加检查代码,并且我需要提醒自己和其他开发人员将来在每个新方法中添加相同的代码。
有没有比在每个方法的盯着时复制相同的代码(或调用相同的函数(更好的解决方案?
谢谢!
这里有一个选项:不要将连接验证逻辑放在 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 执行任何操作。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 是否有一种设计模式或面向对象的基本原则来处理这种共享资源的情况?
- 设计模式中对象中的过程(方法和操作)的状态
- 哪种设计模式仅出于代理目的而组成的对象与之相关
- 从对象成员函数内部删除操作的技术 /设计模式
- 共享对象工厂的设计模式
- 用于对基于I/O的对象执行一系列操作的设计模式
- 数据库访问对象设计模式
- 设计模式:可重用的面向对象软件的元素
- 如何在不使用非构造函数的方法的情况下应用singleton设计模式来返回类对象
- 不同的基本对象过程使用什么设计模式
- 用于创建具有const或非const属性的对象的设计模式
- 设计模式-C++对象生命周期评测
- 设计模式-在C++中返回对象集合的函数
- 为返回对象和NRVO的方法设计模式
- 对象池设计模式问题
- C++设计模式,用于在另一个类中使用抽象类对象
- 状态设计模式-传递对象