2012-03-23 8 views
0

私はjava SQLライブラリを使ってリモートSQLサーバから読み書きするJavaアプリケーションを最適化しようとしています。 (これはプロジェクト用です)。Javaを使用してDBサーバーと永続的な接続を設定する方法は?

我々は、次のライブラリーに限定されています

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

そして、我々は我々のJVM上の8メガバイトのメモリ制限があります。

コードの設定方法は、データベースにアクセスする必要のあるすべての機能に対して、新しい接続が作成されて閉じられます。例えば:...

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/

は、私は、デフォルトでは、メモリに結果セット全体をバッファリングJVMを削減するために、statement.setFetchSize(Integer.MIN_VALUE);機能を使用していますが、それは助けにはならなかった。

私はこのウェブサイトを見ました。

この問題の修正方法に関するご意見は、大変ありがとうございます。ありがとうございます。

答えて

1

他のメソッドに同じオブジェクト参照を渡している場合は、何も複製してはいけません。単にオブジェクトへの参照を渡しているだけです。起こっていることは、SQLを実行するたびにStatementまたは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()のステートメントを閉じる必要があります。これらのオブジェクトに関連付けられたリソース(この場合、ファイルデータの読み書きに使用されるバッファ)は、閉じられるまで解放されません。接続を閉じると、自動的に作成されたステートメントが閉じられますが、接続を開いたままにしておく場合は、ステートメントを終了する必要があります。

関連する問題