2012-03-23 78 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()中的语句。与这些对象相关的资源(在这种情况下,用于读取/写入文件数据的缓冲区)在关闭之前不会被释放。关闭连接会自动关闭使用它创建的语句,但是如果要打开连接,则需要在完成时关闭语句。

相关问题