2017-09-03 7 views
0

최대 절전 모드 + java에 문제가 있습니다. 파일을 가져 와서 CSVRecord로 구문 분석 한 다음 processRecord()로 각 행을 객체 (classA)로 변환 한 다음 내 DB에서 해당 객체를 찾으려고합니다. 객체를 "else"로 업데이트하면 나는 그것을 처음으로 저장한다. 1000 줄을 처리 한 후 트랜잭션을 커밋하고 세션을 정리하고 트랜잭션을 시작합니다. 문제는 파일 (1 백만 레코드)을 처리하기 시작할 때 메모리 Java가 많은 양 (2Gb)으로 증가하기 시작하고 마지막에 해제하지 않기 때문에 다른 파일을 처리하는 방법이 필요하면 메모리가없고, 아직 메모리가 없기 때문에 메모리 예외는 없었지만 서버에서는 동일하지 않습니다.최대 절전 모드, 1Millon 엔티티 저장, 많은 메모리 사용

db = new DB(); 
db.open(); 
trn = db.session().beginTransaction(); 

for (CSVRecord line : lines) { 
     try { 
      if ((classA = processRecord(line)) != null) { 
      classB b = findObject(classA); 

      if (b != null) { 
       db.session().update(b); 
      } else { 
       db.session().save(classA); 
      } 

      if (recordNumber % 1000 == 0) { 
       trn.commit(); 
       db.session().clear(); 
       trn = db.session().beginTransaction(); 
      } 

      recordNumber++; 
      } 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } 
} 

db.close(); 
+0

아마도 쉬운 솔루션은 트랜잭션 당 1000 개를 처리하고 닫고 새 캐시를 시작하는 것입니다. ?? –

+0

네, 시도해 보았습니다. 그러나 아이디어가 프로젝트 관리자에 의해 받아 들여지지 않았습니다. DB를 너무 많이 열거 나 닫을 것이기 때문에 아이디어가 떨어지지도 않았습니다. – Eber

+0

온라인으로 파일을 스트리밍하는 솔루션이 있습니다. 나는 이것을 다음과 같이 발견했다 : http://www.baeldung.com/java-read-lines-large-file –

답변

0

사용 상태없는 세션 그것이이없는 같이 나는) ((높이) 분명하지만, 코드는 다음과 같은 것입니다, 을 워트하지 어느 쪽도하지 않았다 사용하여 동일한 코드를 수행하려고 현재 사용하고있는 방법에 비해 성능을 향상시키는 지속성 컨텍스트 캐시

StatelessSession session = sessionFactory.openStatelessSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<100000; i++) { 
    session.insert(yourentiry); 
} 
tx.commit(); 
session.close(); 
+0

분명히 그것을 읽고 시도 할 것입니다! 내일은 내가 어떻게했는지 알려주지. – Eber

+0

슬프게도, 작동하지 않았고, 여전히 많은 메모리 램을 소비했다. – Eber