数据库连接应该是单例吗?

spa*_*uny 18 java singleton design-patterns

Java中创建单例的最佳方法是什么?数据库连接应该是单例(单例是否是自动线程安全的)?因为理论上DB不能同时被许多用户访问.

Dav*_*ave 27

DB连接通常不应该是Singleton.

两个原因:

  1. 许多DB驱动程序不是线程安全的.使用单例意味着如果您有许多线程,它们将共享相同的连接.单例模式不会为您提供线程安全性.它只允许许多线程轻松共享"全局"实例.
  2. 就个人而言,我认为Singleton经常会导致糟糕的设计:请参阅此帖(由其他人)http://tech.puredanger.com/2007/07/03/pattern-hate-singleton/

而不是这样做考虑数据库池.该池是共享的(如果需要,可以是单例).当您需要进行数据库工作时,您的代码会这样做:

getConnectioFromPool();

doWork()
closeConnection() // releases back to pool
Run Code Online (Sandbox Code Playgroud)

示例池库:

  • 通常,这些观点是非常有效的;但是,有些数据库,例如MongoDB,设计人员特别推荐了Singleton模式,有些DB确实保证线程安全。基本上,请阅读数据库的规范并考虑应用程序... (2认同)

And*_*s_D 5

创建单例的最佳方法(截至目前)是枚举单例模式(Java enum singleton

我怀疑单例对于数据库连接来说是必要的还是有任何价值的。您可能需要一些惰性创建:根据第一次请求创建连接并缓存,进一步的请求将使用缓存的实例来填充:

public ConnectionProvider {
  private Connection conn;

  public static Connection getConnection() {
    if (conn == null || conn.isClosed()) {
      conn = magicallyCreateNewConnection();
    }
    return conn;
  }
}
Run Code Online (Sandbox Code Playgroud)

(不是线程安全的 - 如果需要的话进行同步)