Closed wooyounggggg closed 2 years ago
뇌피셜입니다.
DB에 저장시, 데이터를 개별 단위가 아닌, 배치 단위로 전송한다는 뜻 같습니다.
데이터를 DB에 전송하는 시간을 10ms라고 가정하겠습니다.
(전송 1회 당 데이터 개수가 1개라면) 데이터 1개를 DB에 저장하는데 걸리는 시간 = 10ms 데이터 100,000개를 DB에 저장하는데 걸리는 시간 = 1,000,000ms = 약 17분
(전송 1회 당 데이터 개수가 1000개라면) 데이터 1개를 DB에 저장하는데 걸리는 시간 = 10ms 데이터 100,000개를 DB에 저장하는데 걸리는 시간 = 1,000ms = 1초
성능적인 측면에서 배치로 한꺼번에 여러 개를 전송하기 위해 캐싱하는 것이고 데이터 정합성은 별개의 문제로서, 다른 모듈에서 한꺼번에 처리할 것 같습니다.
1차 캐시들 간의 일관성을 어떻게 유지하는지
Read Skew
Write Skew
싱글 서버 내에서
멀티 서버 간에
출처 : https://vladmihalcea.com/a-beginners-guide-to-read-and-write-skew-phenomena/
Hibernate Session vs Persistent Context
//Persistent Context 1 Starts
Session session1 = HibernateUtil.getSessionFactory().openSession();
Student studentA = (Student)session1.get(Student.class, studentId);
Student studentB = (Student)session1.get(Student.class, studentId);
if(studentA == studentB){
System.out.println("Objects point to same refrence");
}
session1.close();
//Persistent Context 1 Ends
//Persistent Context 2 Starts
Session session2 = HibernateUtil.getSessionFactory().openSession();
Student studentC = (Student)session2.get(Student.class, studentId);
if(studentA == studentC){
System.out.println("Objects point to same refrence");
}else{
System.out.println("Objects do not point to same reference");
}
session2.close();
//Persistent Context 2 Ends
- 출력
Objects point to same refrence Objects do not point to same reference
- Session이 끝나면 Persistent Context는 내부의 자바 객체들과 함께 사라짐
Hibernate SessionFactory vs. JPA EntityManagerFactory
1) Create a single EntityManager for the lifetime of my servlet (e.g. shared between all users) 2) Create one per user (so each user gets their own in the HttpSession) 3) Create one per HTTP request (say, by instantiating a new one and closing it at the end of a doGet method)
@Service
class HelloService {
@Autowired
Repository1 repository1;
@Autowired
Repository2 repository2;
@Transactional
public void logic() {
repository1.hello();
Member member = repository2.findMember();
return member;
}
}
@Repository
class Repository1 {
@PersistenceContext
EntityManager em;
public void hello() {
em.xxx(); // 영속성 컨텍스트 접근
}
}
@Repository
class Repository2 {
@PersistenceContext
EntityManager em;
public void findMember() {
return em.find(Member.class, "id1"); // 영속성 컨텍스트 접근
}
}
스프링은 '트랜잭션 범위의 영속성 컨텍스트 전략'을 기본으로 사용한다.
즉, 트랜잭션이 시작할 때 영속성 컨텍스트를 생성하고, 트랜잭션이 끝날 때 영속성 컨텍스트를 종료
트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다
트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다
트랜잭션이 끝날 때, 1차 캐시 내부의 Entity들의 변경 사항이 Flush되어 Database에 반영된다.
출처 : 김영한님 JPA 책 (13.1 : 트랜잭션 범위의 영속성 컨텍스트)
질문
Hibernate는 세션에 DB 데이터를 저장(캐싱)하나요?
상세 내용
책 7.4 ~ 7.7 내용에서, 하이버네이트가 Session 인터페이스를 통해 DB 조작을 수행한다고 합니다. 그런데 이것이,
세션
에DB의 데이터를 저장
하기도 한다는 것인지 애매하네요. (만약에 그렇다고 한다면, 멀티 서버 환경에서는 데이터 정합성을 어떻게 보장하는지도 이해하면 좋을 것 같습니다.)연관 챕터
57
참고