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

2022-09-01 15:37:02

在 Java 中创建单例的最佳方式是什么?数据库连接应该是单例(作为单例,它会自动实现线程安全)?因为理论上数据库不能同时被许多用户访问。


答案 1

数据库连接通常不应是单例连接。

原因有二:

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

与其这样做,不如考虑数据库池。游泳池是共用的(如果你愿意,可以是单身)。当你需要做数据库工作时,你的代码会这样做:

getConnectioFromPool();

doWork()
closeConnection() // releases back to pool

示例池库:


答案 2

创建单例的最佳方式(截至今天)是枚举单例模式(Java 枚举单例))

我怀疑,单例对于数据库连接是必要的,或者没有任何价值。您可能希望创建一些延迟:在第一次需求时创建连接并进行缓存,进一步的请求将被缓存的实例填满:

public ConnectionProvider {
  private Connection conn;

  public static Connection getConnection() {
    if (conn == null || conn.isClosed()) {
      conn = magicallyCreateNewConnection();
    }
    return conn;
  }
}

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


推荐