Postgres JDBC驱动程序`org.postgresql.ds.PGSimpleDataSource`是线程安全的吗?

时间:2017-05-21 08:13:01

标签: java multithreading postgresql jdbc thread-safety

JDBC driver for Postgres中,PGSimpleDataSource线程安全吗?

也就是说,如果我使用该类的缓存单例实例,我可以将它传递给多个线程吗?每个帖子可能在同一时刻调用getConnection。文档没有提到线程安全性。

我试图避免(a)在Connection和(b)使用连接池进行多线程调用,discussed in the doc。我想为每个servlet线程单独Connection

1 个答案:

答案 0 :(得分:4)

我假设您不会在多个线程上更改数据源配置,因为它不是线程安全的。您可以在https://github.com/pgjdbc/pgjdbc上自行检查源代码,getConnection的具体代码位于BaseDataSource

public Connection getConnection(String user, String password) throws SQLException {
    try {
      Connection con = DriverManager.getConnection(getUrl(), user, password);
      if (LOGGER.isLoggable(Level.FINE)) {
        LOGGER.log(Level.FINE, "Created a {0} for {1} at {2}", new Object[]{getDescription(), user, getUrl()});
      }
      return con;
    } catch (SQLException e) {
      LOGGER.log(Level.SEVERE, "Failed to create a {0} for {1} at {2}: {3}",
          new Object[]{getDescription(), user, getUrl(), e});
      throw e;
    }
}

换句话说,它是DriverManager周围的薄包装。 DriverManager本身是线程安全的,因此如果org.postgresql.Driver是线程安全的,那么它就变成了一个问题。我没有时间尝试验证这一点,但是我们只是说如果这不是线程安全的话会非常令人惊讶(否则世界范围的应用程序会因各种奇怪的竞争条件而失败等)。

作为旁注:PGSimpleDataSource不提供连接池,您可能需要考虑这是否适合您的用例。