私は約50000レコードを選択するのにMySQLとJavaを使用しています。 奇妙なことに、ResultSetとnext()メソッドを使用してデータを読み込むと、フェッチ中にJavaアプリケーションのRAM使用量が増加することがわかります。それは255 MBから始まり、379 MBまで増加します!私が使用しています コードはここにある:mysqlメモリ(RAM)の使用量がResultSet使用中に増加しますか?
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/#mysql50#crawler - used in report?" + "user=root&password=&useUnicode=true&characterEncoding=UTF-8");
Statement st = conn.createStatement();
ResultSet rsDBReader = st.executeQuery("SELECT Id, Content FROM DocsArchive");
while (rsDBReader.next()) {
int docId = rsDBReader.getInt(1);
String content = rsDBReader.getString(2);
. . .
}
rsDBReader.close();
st.close();
conn.close();
} catch (Exception e) {
System.out.println("Exception in reading data: " + e);
}
私はメモリ使用量は、ResultSetのためのプログラムの他の部分ではないことを確信しています。 このプログラムではレコードを更新する必要はないので、作業を終えたらすべてのレコードを削除したいと思っています。 私の推測では、読み込まれたレコードは削除されず、プログラムはメモリを解放しないということです。そこで私は、次のコードを使用するなど、これを避けるためにいくつかのトリックを使用しました:
Statement st = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
st.setFetchSize(500);
rsDBReader.setFetchSize(500);
しかし、それらは変更されませんでした。 :(
だから私は、読み込まれた行の(リリース)のメモリを削除するいくつかの方法が必要です。
もう一つの興味深い点は、機能を仕上げとResultSetの、ステートメントとの接続を閉じ、そしてに行くにも後ということですプログラムの他の部分は、まだプログラムのメモリ使用量は減少しません! おかげを
MySQLはクエリの結果をキャッシュします。 – Johan
ありがとう、しかし、私はどのようにキャッシュを空にすることができますか? – Soheil
メモリを節約するために何ができるのですが、SELECT文ごとに得られる結果の数が制限されます – RMT