2012-03-23 70 views
0

所以我想優化一個Java應用程序,它使用java sql庫從遠程SQL服務器讀取和寫入。 (這是一個項目)。如何使用Java建立與數據庫服務器的持久連接?

限制在以下庫:

com.mysql.* 
java.io.* 
java.lang.* 
java.sql.* 
java.text.* 
java.util.* 
javax.sql.* 

,我們對我們的JVM 8MB的內存限制。

代碼現在設置的方式,對於需要訪問數據庫的每個函數,都會創建並關閉一個新連接。例如:

public static void Read() 
{ 
    Connection connection = NULL; 
    try { 
     connection = DriverManager.getConnection(EnvManager.getDbUrl()); 
     Statement statement = connection.createStatement(); 

    statement.setFetchSize(Integer.MIN_VALUE); 

     ******* FUNCTION ******** 
    }finally { 
    if(connection != null) { 
     try { 
     connection.close(); 
     } catch (Exception e) { 
     } 
    } 
} 

    public static void Write() 
{ 
    Connection connection = NULL; 
    try { 
     connection = DriverManager.getConnection(EnvManager.getDbUrl()); 
     Statement statement = connection.createStatement(); 
    statement.setFetchSize(Integer.MIN_VALUE); 

     ******* FUNCTION ******** 
    }finally { 
    if(connection != null) { 
     try { 
     connection.close(); 
     } catch (Exception e) { 
     } 
    } 
} 

等等

我試圖建立一個持久連接,這樣我既可以在連接對象傳遞,即

... 
... 
Connection connection = NULL; 
try { 
    connection = DriverManager.getConnection(EnvManager.getDbUrl()); 
Read(connection); 
Write(connection); 

}finally { 
    if(connection != null) { 
     try { 
     connection.close(); 
     } catch (Exception e) { 
     } 
    } 
... 
... 

然而,當我試圖做到這一點,每當我嘗試寫入數據庫然後再讀取一個大文件(超過5 MB)時,我的JVM一直在拋出內存不足的錯誤。

我的問題基本上是,當你做一個單一的連接對象,並不斷傳遞給函數會發生什麼?它似乎每次使用時都會以某種方式增長或複製。

我看了看這個網站:

http://benjchristensen.com/2008/05/27/mysql-jdbc-memory-usage-on-large-resultset/

這表明我使用statement.setFetchSize(Integer.MIN_VALUE);功能,從而削減了JVM緩衝整個結果由默認的內存設置,但沒有幫助。

有關如何解決此問題的任何想法將不勝感激,謝謝。

回答

1

如果您將相同的對象引用傳遞給其他方法,則不應該複製任何內容。您只需傳遞對象的引用即可。可能發生的情況是,每次執行SQL時,可能都沒有關閉語句或PreparedStatements。

在完成執行查詢後,您需要關閉將消耗資源的所有資源。這裏是一個例子

public void Read() { 
    Connection conn = null; 
    Statement statement = null; 
    ResultSet rs = null; 

    try { 
     connection = DriverManager.getConnection(EnvManager.getDbUrl()); 
     statment = connection.createStatement(); 
     statement.setFetchSize(Integer.MIN_VALUE); 

     // Do more stuff, iterate to ResultSet etc... 
    } catch (SQLException ex) { 
     // Exception handling stuff 
     ... 
    } finally { 
     if (rs != null) { 
      try { 
       rs.close(); 
      } catch (SQLException e) { /* ignored */} 
     } 
     if (statment != null) { 
      try { 
       statment.close(); 
      } catch (SQLException e) { /* ignored */} 
     } 
     if (conn != null) { 
      try { 
       conn.close(); 
      } catch (SQLException e) { /* ignored */} 
     } 
    } 
} 
0

您可能需要關閉Read()和Write()中的語句。與這些對象相關的資源(在這種情況下,用於讀取/寫入文件數據的緩衝區)在關閉之前不會被釋放。關閉連接會自動關閉使用它創建的語句,但是如果要打開連接,則需要在完成時關閉語句。

相關問題