반응형
두 테이블 이상의 조건에서 최대 절전 모드로 대량 삽입
데이터베이스에 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
반응형
'programing' 카테고리의 다른 글
| MERGE 테이블, 일치 시 아무것도 수행하지 않음 (0) | 2023.11.05 |
|---|---|
| TypeError: 정의되지 않은(mariaDB, ExpressJs) 속성 'findAll'을 읽을 수 없습니다. (0) | 2023.11.05 |
| 재현 가능한 좋은 Apache Spark 예제를 만드는 방법 (0) | 2023.11.05 |
| Wordpress SlideDeck2 플러그인 Role Scoper 플러그인과 Confilct (0) | 2023.11.05 |
| !중요한것이 성능에 안좋은가요? (0) | 2023.11.05 |