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

标签 c++ singleton

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

它能保证 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/

相关文章:

c++ - 如何将非常大的十进制数转换为阶乘数系统?

iphone - Objective-C 中的线程安全单例对象?

C++单例实现,双重检查锁定

c++ - 为什么我的编译器试图将 signed long long 转换为 unsigned int

c++ - 用于在代码库中提取硬编码字符串的 Lua 模式匹配

c++ - 有没有更好的删除动态数组元素的方法?

c++ - 在c/c++中有没有PHP的var_dump之类的东西?

java - 单例类中双重检查锁定模式的潜在问题

c++ - 单例示例如何工作

android - Kotlin 单例应用程序类