我应该同步 DataSource 的 getConnection() 吗

Should I synchronize getConnection() of DataSource

我有这个带有连接池的单例。

public enum ConnectionPool {
    INSTANCE;

    private DataSource ds = null;

    ConnectionPool() {
      try {
         final Context initCtx = new InitialContext();
         ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/test");
      } catch (NamingException e) {
         e.printStackTrace();
      }
    }

   public Connection getConnection() throws SQLException {
      return ds.getConnection();
   }
}

我是否应该同步 getConnection() 以防止从不同的线程获取相同的实例?看起来它已经被 Tomcat 同步了,但我不确定(我使用 Tomcat 8)。

虽然 java 文档中没有明确提及,但 DataSource#getConnection 方法被设计为在单个 DataSource 实例上同时调用。

一般情况下您不需要提供客户端级同步。

java 文档中的限制可能被省略以提供实施的灵活性。

嗯,你一开始就不应该有这个 "ConnectionPool"。考虑使用经过测试的实际执行连接池的。

无论如何,您的 class 的线程安全性与 DataSource 的线程安全性相同,因为您委托给它并且它是您拥有的唯一共享状态。 JDBC API 中没有任何内容可以确保线程安全,因此您需要检查实现细节。