【问题标题】:Should I synchronize getConnection() of DataSource我应该同步 DataSource 的 getConnection()
【发布时间】:2016-06-21 17:26:58
【问题描述】:

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

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

【问题讨论】:

  • 你应该使用单例模式。
  • @RaghuKNair,这是一个单身人士。
  • 单身永远不是正确的模式。 stackoverflow.com/questions/137975/…
  • 我这辈子从来没有同步过。
  • 只是想知道在创建 ConnectionPool 时是否有异常,您可能会得到 NPE,因为 ds 为空

标签: java sql jdbc connection-pooling


【解决方案1】:

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

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

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

【讨论】:

  • "that said" 通常会与您之前的陈述相反。
  • @shmosel 谢谢你,我以为它有不同的含义
【解决方案2】:

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

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

【讨论】:

  • 我必须使用 DOA 类,所以在每个类中调用 lookup() 似乎都不对
  • 好吧,如果是单反模式,你可以使用库,注入数据源
  • 感谢提示我不知道追索注入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 2013-08-17
  • 2012-12-16
  • 2012-01-05
相关资源
最近更新 更多