1) JPA 등록 배치
public void insertBoardBatch() {
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
for (int i = 0; i < 100; i++) {
Board board = Board.builder().title("board" + i).build();
em.persist(board);
if(i%10 == 0) {
em.flush();
em.clear();
}
}
tx.commit();
em.close();
}
2) JPA 페이징 배치 처리
3) 하이버네이트 scroll 사용
public void updateBoardBatch() {
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
Session session = em.unwrap(Session.class); //하이버네이트 세션 구현
tx.begin();
ScrollableResults scroll = session.createQuery("select b from Board b")
.setCacheMode(CacheMode.IGNORE) //2차캐시 기능 off
.scroll(ScrollMode.FORWARD_ONLY);
int cnt = 0;
while(scroll.next()) { //반환받은 ScrollableResults 객체를 하나씩 조회
Board board = (Board) scroll.get(0);
String newTitle = "batch update" + cnt;
board.changeTitle(newTitle);
cnt ++;
if(cnt % 10 == 0) {
session.flush();
session.clear(); //영속성 컨텍스트 초기화
}
}
tx.commit();
em.close();
}
public Board changeTitle(String newTitle) {
this.title = newTitle;
return this;
}
4) 하이버네이트 무상태 세션 사용
public void updateBoardStateless() {
SessionFactory sessionFactory = emf.unwrap(SessionFactory.class); //하이버네이트 세션팩토리 구현
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
ScrollableResults scroll = session.createQuery("select b from Board b").scroll();
while(scroll.next()) { //반환받은 ScrollableResults 객체를 하나씩 조회
Board board = (Board) scroll.get(0);
String newTitle = "stateless update";
board.changeTitle(newTitle);
session.update(board); //직접 호출
}
tx.commit();
session.close();
}