gpt4 book ai didi

c++ - 使用单例仅连接一次数据库

转载 作者:太空宇宙 更新时间:2023-11-04 13:16:21 24 4
gpt4 key购买 nike

我尝试使用单例模式仅连接一次数据库,下面是我的实现。

它能保证 m_connector.connect(); 只被调用一次吗?

使用单例是最好的解决方案吗?

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;
};

最佳答案

Will it guarantee that the m_connector.connect(); only run once?

没有。

在这种实现情况下(也称为 Scott Meyer's 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(); 的函数,而您担心 thread safety ,你不应该需要。根据当前标准,它保证是线程安全的。


Is using singleton the best solution?

可能不会。没有什么会阻碍您稍后修改您的决定,并决定您确实需要更多 ConnectionManager 实例。

将使用 ConnectionManager::getManager(); 的代码的任何其他部分都与该单例类紧密耦合,如果应该使代码更通用,将很难重构代码.

这种硬编码数据库连接

  ConnectionManager():m_connector("port")
// ^^^^^^

极大地缩小了应用程序的可扩展性。


我个人会让它成为一个类,使用适当的构造函数参数来创建连接,并实现一个公共(public)(抽象)接口(interface),可以通过工厂函数或其他一些访问 Creational Design Patterns专用于实例创建,仅此而已。

关于c++ - 使用单例仅连接一次数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37168836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com