1

我通过 Postgres JDBC 驱动程序使用 Java 1.7 和 Postgres。数据库连接将从 Web 服务中使用。在测试中,我收到以下错误:

FATAL: connection limit exceeded for non-superusers

我通过使我的连接静态解决了这个错误,并且只创建了一次。我的问题是,静态连接安全吗?这是正确的方法吗?

我通过一个看起来像这样的 ConnectionFactory 使用连接:

public class ConnectionFactory
{

   String driverClassName = "org.postgresql.Driver";
   String connectionUrl = "jdbc:postgresql://localhost:5432/dbName";
   String dbUser = "user";
   String dbPwd = "password";
   private static ConnectionFactory connectionFactory = null;
   private static Connection conn = null;

   private ConnectionFactory()
   {
      try
      {
         Class.forName(driverClassName);
      }
      catch (ClassNotFoundException e)
      {
         e.printStackTrace();
      }
   }
   public Connection getConnection() throws SQLException
   {
      if (conn == null)
      {
         conn = DriverManager.getConnection(connectionUrl, dbUser, dbPwd);
      }
      return conn;
   }

   public static ConnectionFactory getInstance()
   {
      if (connectionFactory == null)
      {
         connectionFactory = new ConnectionFactory();
      }
      return connectionFactory;
   }
}
4

2 回答 2

1

抱歉,原始帖子没有仔细查看您的代码。哇。我还是看不懂。无论如何,第三次的魅力。如果您的代码是单线程的 - 那么您就可以了。如果它是多线程的,请使用 Commons 连接池之类的东西来管理您的连接。看起来驱动程序是线程安全的,但不应将连接视为线程安全的。因此,一旦加载了驱动程序,您就可以安全地从多个线程调用驱动程序上的 getConnection,但不应跨线程共享连接。

于 2013-03-03T19:54:03.710 回答
1

Postgres JDBC 驱动程序被记录为线程安全的,如果需要,该连接可以被多个线程使用。如果一个线程尝试使用该连接,而另一个线程正在使用它,它将一直等到另一个线程完成其当前操作。

出于性能原因,无论如何都可以使用连接池。

于 2013-03-03T20:13:45.993 回答