使用singleton只连接到数据库一次
connect to database only one time using singleton
我尝试使用singleton模式只连接到数据库一次,下面是我的实现。
它能保证m_connector.connect();
只被调用一次吗?
使用singleton是最好的解决方案吗?
class ConnectionManager
{
public:
static ConnectionManager& getManager()
{
static ConnectionManager manager;
return manager;
}
void reconnect();
Connection getConnection();
private:
ConnectionManager():m_connector("port")
{
m_connector.connect();
};
ConnectionManager(ConnectionManager const&);
void operator=(ConnectionManager const&);
Connector m_connector;
};
它能保证
m_connector.connect();
只运行一次吗?
没有。
在这种实现(也称为Scott Meyer的Singleton)的情况下,唯一可以保证的事实是ConnectionManager
的构造函数只被调用一次。
static ConnectionManager& getManager()
{
static ConnectionManager manager;
return manager;
}
它将在第一次调用ConnectionManager::getManager();
时立即调用。
构造函数依次调用m_connector.connect()
ConnectionManager():m_connector("port")
{
m_connector.connect();
};
不能保证
m_connector.connect();
不会从代码的任何其他部分调用。的声明
void reconnect();
甚至以某种方式暗示了这一点。
但是,这一切都在你的控制之下。
如果构造函数是唯一一个调用m_connector.connect();
的函数,并且您担心线程安全,那么您不应该这样做。根据当前标准,它保证是线程安全的。
使用singleton是最好的解决方案吗?
可能不会。没有什么会阻碍你以后修改你的决定,并决定你实际上需要更多的ConnectionManager
实例。
代码中任何其他将使用ConnectionManager::getManager();
的部分都与该单例类紧密耦合,如果应该使代码更通用,那么将很难重构代码。
这种硬编码的数据库连接
ConnectionManager():m_connector("port")
// ^^^^^^
极大地缩小了应用程序的可伸缩性。
我个人会把它作为一个类,使用适当的构造函数参数来创建连接,并实现一个公共(抽象)接口,可以通过工厂函数或其他一些专门用于实例创建的创造性设计模式来访问,而不是其他。
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 如何使用C++一次读取整个二进制文件
- 花括号使循环运行一次?
- 从子菜单返回后,正确的输入至少进入验证循环一次
- 使用singleton只连接到数据库一次