[JPA] 쓰기 지연의 장점 등
쓰기 지연의 장점데이터베이스의 락의 최소화 Uploaded by N2T
- 자바/JPA
- · 2023. 11. 19.
스칼라 타입으로 조회엔티티로 조회 대신 스칼라 타입 ( 기본 데이터 타입 ) 으로 필드 조회영속성 컨텍스트가 결과 관리 X 메모리 사용을 줄일 수 있다.select o.id, o.name, o.price from Order o읽기 전용 쿼리 힌트org.hibernate.readOnly` 힌트 사용시 엔티티를 읽기 전용으로 조회 가능하다.스냅샷의 저장단계를 생략할 수 있다고 한다.스냅샷?Hibernate 가 엔티티를 로드하는 경우 초기의 엔티티의 상태를 말한다고 한다.해당 스냅샷은 트랜잭션이 종료되는 경우 (자동 혹은 명시적인 플러시 시점) 엔티티가 변경되었는지 체크하는 과정에서 사용된다고 한다.더티체킹 라는 부분을 수행하지 않는다고 생각하면 된다.엔티티의 변경감지하는 로직을 수행하지 않는다.TypedQu..
쓰기 지연과 JDBC 배치JDBC 배치 기능INSERT 시 마다 DB와 통신이 발생함.네트워크 IO 비용이 있기에.. 성능에 부정적인 영향을 미친다.JDBC 배치로 SQL 명령을 한 번에 DB로 보내 성능을 극대화 할 수 있다.JPA 플러시 기능 활용JPA 는 내부적으로 플러시 기능으로 DB와 통신함.JPA 는 JDBC 의 SQL 배치 기능을 보다 효과적으로 사용이 가능하다.하이버네이트의 설정hibernate.jdbc.batch_size 속성을 50 으로 설정하면최대 50건의 데이터를 모아서 SQL 배치를 수행함쓰기 지연의 작동 방식같은 종류의 SQL 명령을 모아서 배치 처리함.em.persist(new Member()); // 1 em.persist(new Member()); // 2 em.persis..
쓰기 지연의 장점데이터베이스의 락의 최소화 Uploaded by N2T
JPA 예외의 기본 구조JPA 표준 예외는 javax.persistence.PersistenceException의 자식 클래스해당 예외 클래스는 RuntimeExcetion 의 자식임.언체크 예외JPA 예외의 분류트랜잭션 롤백을 표시하는 예외심각한 예외로 강제로 커밋도 안됨.롤백 X개발자가 커밋할지 롤백할지 선택이 가능하다.아래부터는 책에 있던 에러내역을 표기한다.참고트랜잭션 롤백을 표시하는 주요 예외들javax.persistence.EntityExistsException: EntityManager.persist(..) 호출 시 동일한 엔티티가 이미 있을 때 발생.javax.persistence.EntityNotFoundException: EntityManager.getReference(..) 호출 후 ..
트랜잭션을 롤백하면 DB 의 변경사항만 원래대로 돌아간다고 한다.!수정된 상태로 영속성 컨텍스트에는 남아있다고 한다.만약 해당 내용을 모르고 JPA 를 사용한다면 엄청 위험한 상황이 도래할 수 있을 것 같다고 생각이 든다..라고 생각했지만 역시 스프링 프레임워크가 트랜잭션 AOP 시점에 다 컨트롤을 하고 있었군..어떻게 대처?트랜잭션이 롤백된 영속성 컨텍스트를 그대로 사용하는 건 위험하다새로운 영속성 컨텍스트를 생성혹은엔티티매니저 의 clear 를 호출하여 영속성 컨텍스트를 초기화한 후에 사용해야 한다!스프링의 접근 방식기본 전략트랜잭션 AOP 종료 시점에 트랜잭션 영속성 컨텍스트도 종료된다고 한다.롤백후에 문제가 발생하지 안흥더 자세한 내용은 JpaTransactionManager 의 doRollbac..
@Test void transactionalEntityEqualsTest() { Member member = new Member("테스트", null); em.persist(member); Member member1 = memberRepository.findById(member.getId()) .orElseThrow(); System.out.println("member1 = " + member1); System.out.println("member1 == member = " + (member1 == member)); System.out.println("member1.equals(member) = " + member1.equals(member)); }member1 = Member(id=3, name=테스트)..