超出了Java Postgres连接限制

时间:2013-03-03 18:58:04

标签: java postgresql jdbc

我通过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;
   }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

Postgres JDBC驱动程序为documented as thread safe,如果需要,多个线程可以使用该连接。如果某个线程在另一个线程正在使用该连接时尝试使用该连接,它将等待另一个线程完成其当前操作。

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