2010-05-25 1 views
1

나는 asked the question the other day을 작성하고 해결책을 반영하기 위해 코드를 다시 작성했지만 이제는 새로운 문제가 있습니다. 여기에 코드가 있습니다.데이터베이스에서 XML로 많은 양의 데이터를 저장할 수있는 방법 (메모리 문제, 2 부)?

이것은 호출/쓰기 기능입니다. 8 가지 XML 파일을 만드는 proizvod의 8 가지 유형이 있습니다. XML 파일이 생성 된 후, 사용자 정의 지퍼 클래스에 의해 압축 할 필요가 :

generateXML(tmpParam,queryRBR,proizvod.getOznaka()); 
writeToZip(proizvod.getOznaka()); 

이 내부 writeToZip입니다 : 이것은 내부 generateXML입니다

ZipEntry ze = new ZipEntry(oznaka + ".xml"); 
FileOutputStream fos = new FileOutputStream(new File(zipFolder + oznaka + ".zip")); 
ZipOutputStream zos = new ZipOutputStream(fos); 
zos.putNextEntry(ze); 
FileInputStream fis = new FileInputStream(new File(zipFolder + oznaka + ".xml")); 
final byte[] buffer = new byte[1024]; 
int n; 
while ((n = fis.read(buffer)) != -1) 
    zos.write(buffer, 0, n); 
zos.closeEntry(); 
zos.flush(); 
zos.close(); 
fis.close(); 

:

PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(zipFolder +oznaka + ".xml"))); 
writer.print("\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); 
writer.print("\n<PROSTORNE_JEDINICE>"); 
stmt = cm.getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
String q = ""; 
rs = stmt.executeQuery(q); 
if (rs != null) { 
    System.out.println("Početak u : " + Util.nowTime()); 
    while (rs.next()) { 
     writer.print("\n\t<row>"); 
     writer.print("\n\t\t<ID>" + Util.transformToHTML(rs.getInt("id")) + "</ID>"); 
     writer.print("\n\t\t<JED_ID>" + Util.transformToHTML(rs.getInt("jed_id")) + "</JED_ID>"); 
     //etc 
     writer.print("\n\t</row>"); 
    } 
    System.out.println("Kraj u : " + Util.nowTime()); 
} 
writer.print("\n</PROSTORNE_JEDINICE>"); 

generateXML 부분은 여전히 ​​많은 메모리를 필요로합니다 (정확하게 추측한다면 가능한 한 조금씩 걸립니다). 어떻게 최적화 할 수 있는지 보지 못합니다. writer.print 기능을 제공하는 방법)? 나는 즉시 볼

+0

Btw :'stmt.executeQuery()'절대 null을 반환합니다. SQLException를 Throw하는지, null 이외의 ResultSet를 돌려줍니다. – BalusC

+0

결과 집합에서 파일에 직접 쓰면 메모리 문제가있는 곳을 즉시 알 수 없습니다. 프로필을 작성해야합니다. 조언을 얻으려면 http://stackoverflow.com/questions/2153409/how-to-measure-performance-in-java-developement/2153424#2153424 –

+0

Tnx를 참조하십시오. – Andrija

답변

0

두 가지 당신이 generateXml에서 의 PrintWriter (작가)를 닫지 마십시오 당신이 WriteToZipFile에 FileOutputStream에 (FOS)를 닫지 않도록이다 (어쩌면/붙여 넣기 오류를 복사).

Memory-gliches를 찾으려면 dotTrace을 권하고 싶습니다. 코드 동작에 약간의 비정상 성이있을 수 있습니다.

+0

dotTrace에 제공하는 링크가 .NET 용 프로파일 러에 연결됩니다. Java 응용 프로그램에 너무 유용하지는 않습니다. –

+0

작성자는 코드의 뒷부분에서 닫히지 만 "관련 없음"입니다. 메서드가 한 번 (가장 큰 "proizvod") 실행되도록 코드에 주석을 달았습니다. 그래서 영향을 미치지 않는다고 생각합니다. 먼저 문자열이 메모리에 보관되고 두 번째로 파일에 쓰는 동안 파일이 메모리에 유지된다는 두 가지 사항 만 염두에 둡니다. 나는 모든 반복을 닫으려고 할 수 있다고 생각하니? – Andrija

+0

또한 RecordSet 객체를 닫지 않아도됩니까? @Andrija : generateXML에서 각 행이 기록 된 후 PrintWriter를 플러시 할 수 있습니다. – Michael

관련 문제