2009-01-28 195 views
1

我在我的Java應用程序中創建了一個getDBConnection方法。這將返回一個連接對象,因此我沒有在這個方法本身中關閉這個連接。JDBC連接問題

現在,我定期從我的應用程序中的各種方法調用此方法,並在try - finally塊內關閉它們。我認爲這應該在使用後釋放連接。但是,我看到MySQL管理員的服務器連接選項卡中打開了大量連接(大約50個)。

//Defining a method to retrieve a database connection 
// PropDemo is a properties class that retrieves Database related values from a file 
public Connection getDBConnection() { 

    //Instantiating the Properties object 
    PropDemo prop = new PropDemo(); 
    Connection con = null; 

    // Retrieving values from the parameters.properties file 
    String JdbcDriver = prop.getMessage("JdbcDriver"); 
    String JdbcUrlPrefix = prop.getMessage("JdbcUrlPrefix"); 
    String DBIP = prop.getMessage("DBIP"); 
    String DBName = prop.getMessage("DBName"); 
    String DBUser = prop.getMessage("DBUser"); 
    String DBPassword = prop.getMessage("DBPassword"); 

    try { 

     // Loading and instantiating the JDBC MySQL connector driver class 
     Class.forName(JdbcDriver).newInstance(); 
     con = DriverManager.getConnection(JdbcUrlPrefix + DBIP + "/" + DBName, DBUser, DBPassword); 


      if (con.isClosed()) 
        Logger.log("Connection cannot be established", "vm"); 

    } catch (Exception e) { 
     Logger.log("Exception: " + e, "vm"); 
     Logger.log(Logger.stack2string(e), "vm"); 
    } 
    return con; 

} 

我也關閉了相關的ResultSet和Statement對象。這裏可能會丟失什麼?

出於效率和安全原因,我計劃用PreparedStatements替換所有語句。這會有幫助嗎?還有什麼可以做的?

編輯: 這只是一個核心的Java應用程序,通過MySQL-JDBC連接器反覆查詢MySQL數據庫中某些字段的更改。我沒有使用像Spring或Hibernate這樣的框架。

+0

你可以發佈您的代碼? – Mark 2009-01-28 01:00:16

+0

需要更多信息。你的環境是什麼,它是一個獨立的應用程序框架,一個JavaEE容器?你使用連接池嗎? – OscarRyz 2009-01-28 01:22:07

回答

1

您的代碼看起來很健全。

這就是您創建新連接的方式。

可能是錯誤是你關閉它的地方。

你應該在finally塊中關閉它。

還有一些問題。

1)你確定這50個連接是來自這個程序嗎?也許還有一些人從你的同一個辦公室來。要確認這一點,您需要停止該程序,然後再次查看連接監視器。

2)您的應用程序是否同時使用多個連接?當你在同一時間使用50時可能是一個高峯。

如果您可以在關閉連接的位置發佈代碼。問題出在那裏。

此外,我建議你使用連接池。你可以建立一個你自己或你可以看到從該頁面的結果:

How many JDBC connections in Java?

0

您是否在應用程序關閉時關閉連接對象?

0

你在J2EE應用服務器或Hibernate中使用JDBC連接嗎? 這兩者都傾向於以一個相當高的連接池開始,所以你會看到一個很大的數字。

查看連接池的詳細信息。

0

你可以採取一個Singleton解決問題的方法,並僅在當前一個是空創建一個新的連接對象:

If (connectionObject != null){ 
    return connectionObject; 
}else { 
    //create new connection object 
} 

這將確保你只需要在任何時候一個非空連接。