MySQL과 Java를 사용하여 약 50000 개의 레코드를 선택하고 있습니다. 이상한 점은 ResultSet 및 next() 메서드를 사용하여 데이터를 읽을 때 페치 중에 내 Java 응용 프로그램의 RAM 사용량이 증가한다는 것입니다. 255MB로 시작하여 최대 379MB까지 증가합니다! 내가 사용하고 코드가 여기에 있습니다 :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