我应该同步DataSource的getConnection()

时间:2016-03-07 23:11:57

标签: java sql jdbc connection-pooling

我有连接池的singelton。

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)。

2 个答案:

答案 0 :(得分:7)

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

在一般情况下,您无需提供客户端级别的同步。

可能省略了java docs中的限制,以便为实现提供灵活性。

答案 1 :(得分:1)

嗯,你不应该首先拥有这个“ConnectionPool”。考虑使用经过测试的实际连接池。

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