2016-06-24 1 views
3

3 개의 테이블에 15000 개 이상의 행을 삽입/업데이트해야한다는 요구 사항이 있습니다. 총 삽입 수가 45k입니다.Stateless 세션을 사용하는 대량 삽입/업데이트 - 최대 절전 모드

온라인으로 읽은 후 hibernate에서 Statelesssession을 사용했는데 컨텍스트 캐시가 없으므로 일괄 처리에 가장 적합합니다.

session = sessionFactory.openStatelessSession; 
for(Employee e: emplList) { 
    session.insert(e); 
} 
transcation.commit; 

그러나이 코드는 완료하는 데 1 시간 이상 걸립니다.

한 번에 모든 개체 개체를 저장하는 방법이 있습니까? 전체 컬렉션을 하나씩 저장하지 않고 저장 하시겠습니까?

편집 : 빠른 삽입을 제공 할 수있는 다른 프레임 워크가 있습니까?

건배 !! 그 Hibernate는 배치 할 수 있습니다

hibernate.jdbc.batch_size

: 당신은 최대 절전 모드 속성을 설정했는지 확인해야합니다

How to batch INSERT and UPDATE statements with Hibernate

+0

간단한 세션으로'hibernate.order_inserts'와'hibernate.order_updates'을 해봤습니까? 또한 직원 한 명을 저장할 때 실행되는 SQL 문을 표시 할 수 있습니까? –

답변

1

당신은 블라드 미할 세아의이 기사를 읽어야한다 이 삽입은 그렇지 않으면 한 번에 하나씩 완료됩니다.

+0

기사마다 batch_size를 사용해야한다고 나와 있지만 삽입하는 데는 동일한 시간이 걸립니다. –

1

:

+0

나는 정상적인 세션에서이 피곤하고 여전히 같은 시간이 걸리거나 닫힙니다. –

1

한 번에 모든 항목을 삽입 할 수있는 방법이 없습니다. 심지어 당신이 session.save(emplList) 내부적으로 최대 절전 모드와 같은 일을 할 수 있다면 하나씩 저장합니다. 따라서

은 사용 설명서 StatelessSession 일괄 기능을 사용하지 않는 최대 절전 모드 :

삽입(), 업데이트() 및 삭제()는 StatelessSession 인터페이스에 의해 정의 작업 데이터베이스 행에서 직접 운영하고 있습니다. 이로 인해 해당 SQL 조작은 이며 즉시 실행됩니다 (). Session 인터페이스에 의해 정의 된 save(), saveOrUpdate() 및 delete() 작업과는 다른 의미를가집니다.

대신 정상적인 세션을 사용하고 수시로 캐시를 지우십시오. 실제로 코드를 먼저 측정 한 다음 hibernate.jdbc.batch_size과 같이 변경하여 제안 된로드가 얼마나 개선되었는지 확인할 수 있습니다.

은 다음과 같이 변경 시도 :

session = sessionFactory.openSession(); 
int count = 0; 
int step = 0; 
int stepSize = 1_000; 
long start = System.currentTimeMillis(); 
for(Employee e:emplList) { 
    session.save(e); 
    count++; 
    if (step++ == stepSize) { 
     long elapsed = System.currentTimeMillis() - start; 
     long linesPerSecond = stepSize/elapsed * 1_000; 
     StringBuilder msg = new StringBuilder(); 
     msg.append("Step time: "); 
     msg.append(elapsed); 
     msg.append(" ms Lines: "); 
     msg.append(count); 
     msg.append("/"); 
     msg.append(emplList.size()); 
     msg.append(" Lines/Seconds: "); 
     msg.append(linesPerSecond); 
     System.out.println(msg.toString()); 
     start = System.currentTimeMillis(); 
     step = 0; 
     session.clear(); 
    } 
} 
transcation.commit; 

이 소개 hibernate.jdbc.batch_size - 당신은 몇 가지 매우 큰 사용 및 네트워크 구성의 기본 데이터베이스에 따라 등 다양한 값을 시도 할 수 있습니다. 예를 들어, 앱 서버와 데이터베이스 서버 사이의 1gbps 네트워크에 10,000의 값을 사용하여 초당 20,000 개의 레코드를 제공합니다.

stepSize을 동일한 값 hibernate.jdbc.batch_size으로 변경하십시오.

+0

기본적으로 당신은 내가이 많은 삽입물에 소요되는 시간을 줄일 수 없다고 말하고 있습니다. 이 같은 것을 제공하는 다른 프레임 워크가 있습니까? –

+0

아니요. jdbc 기반이기 때문에. – DiogoSantana

+0

배치 (batch) jdbc 배치 삽입으로 더 빠르게 수행 할 수 있습니다. 정상적인 Hibernate Session을 사용하고'hibernate.jdbc_batch_size'를 변경하십시오. – DiogoSantana