programing

두 테이블 이상의 조건에서 최대 절전 모드로 대량 삽입

sourcejob 2023. 11. 5. 11:34
반응형

두 테이블 이상의 조건에서 최대 절전 모드로 대량 삽입

데이터베이스에 URL 목록이 없거나 다른 테이블에 없는 조건으로 삽입하고 싶습니다.
현재 제 시도는 매우 느립니다. 모든 요청은 100ms - 500ms가 걸릴 수 있습니다.

for(URL url : urls) {
 if (this.urlToEditService.findByUrl(newUrl).size() == 0 &&
     this.rawPageService.findByUrl(newUrl).size() == 0) {

      UrlToEdit urlToEdit = new UrlToEdit(newUrl);
      urlToEditService.save(urlToEdit);
 }
}

이것이 제 세이브 방법입니다.

public boolean save(UrlToEdit urlToEdit) {
        Transaction transaction = null;
        try (Session session = factory.openSession()) {
            transaction = session.beginTransaction();
            session.save(urlToEdit);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
            return false;
        }

        return true;
}

한 번의 거래로 모두 삽입할 수 있는 방법이 있습니까?열린 부분과 닫힌 부분이 목 부분이라는 것을 상상할 수 있었습니다.

EDIT1: 코드를 조금 변경하여 다음 답변을 바탕으로 한 트랜잭션에 저장합니다.

List<URLToEdit> list = new ArrayList();
for(URL url : urls) {
 if (this.urlToEditService.findByUrl(newUrl).size() == 0 &&
     this.rawPageService.findByUrl(newUrl).size() == 0) {

      list.add( new UrlToEdit(newUrl));
 }
}

public boolean save(List<URLToEdit> urlToEditList) {
        Transaction transaction = null;
        
        int counter = 0;

        try (Session session = factory.openSession()) {
            transaction = session.beginTransaction();
            for (UrlToEdit urlToEdit : urlToEditList) {
                     session.save(urlToEdit);
                     counter++;

                     if(counter > 20) { 
                         counter = 0;
                         session.flush();
                         session.clear();
                     }
            }
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
            return false;
        }

        return true;
}

하지만 속도는 늘지 않습니다.그래서 느린 부분은 여전히 존재 확인입니다.

언급URL : https://stackoverflow.com/questions/62686730/bulk-insert-in-hibernate-under-conditions-over-two-tables

반응형