2013-03-03 32 views
1

我通過Postgres JDBC驅動程序使用Java 1.7和Postgres。數據庫連接將從Web服務中使用。在測試中,我得到以下錯誤:超過Java Postgres連接限制

FATAL: connection limit exceeded for non-superusers 

我解決了錯誤,使我的連接靜態,並且只創建一次。我的問題是,靜態連接是否安全?這是正確的方法嗎?

我使用通過連接工廠,看起來像這樣的連接:

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; 
    } 
} 

回答

1

Postgres JDBC驅動程序是documented as thread safe,如果需要,該連接可以被多個線程使用。如果一個線程試圖在另一個線程正在使用連接時使用連接,它將一直等到另一個線程完成其當前操作。

由於性能原因,可能會使用連接池。

1

對不起,原來的職位並沒有在你的代碼仔細看。哇。我仍然無法閱讀。無論如何,第三次是魅力。如果你的代碼是單線程的 - 那麼你的罰款。如果它是多線程的,請使用Commons連接池等來管理連接。它看起來像驅動程序是線程安全的,但連接不應被視爲線程安全。因此,一旦驅動程序被加載,您可以安全地從多個線程調用驅動程序上的getConnection,但不應該在線程之間共享連接。

+0

我認爲這是不正確的。看起來連接是線程安全的,但是,塊。 – 2013-03-05 00:41:49