caffeine-library / pro-spring-5

🌱 전문가를 위한 스프링5를 읽는 스터디
5 stars 0 forks source link

[question] Hibernate는 세션에 DB 데이터를 저장(캐싱)하나요? #60

Closed wooyounggggg closed 2 years ago

wooyounggggg commented 3 years ago

질문

Hibernate는 세션에 DB 데이터를 저장(캐싱)하나요?

상세 내용

책 7.4 ~ 7.7 내용에서, 하이버네이트가 Session 인터페이스를 통해 DB 조작을 수행한다고 합니다. 그런데 이것이, 세션DB의 데이터를 저장하기도 한다는 것인지 애매하네요. (만약에 그렇다고 한다면, 멀티 서버 환경에서는 데이터 정합성을 어떻게 보장하는지도 이해하면 좋을 것 같습니다.)

연관 챕터

57

참고

JasonYoo1995 commented 3 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초

성능적인 측면에서 배치로 한꺼번에 여러 개를 전송하기 위해 캐싱하는 것이고 데이터 정합성은 별개의 문제로서, 다른 모듈에서 한꺼번에 처리할 것 같습니다.

emiling commented 3 years ago

연관된 링크 (entitymanager multi server)

https://stackoverflow.com/questions/3444449/jpa-with-multiple-servers https://stackoverflow.com/questions/31081362/issue-with-hibernate-entity-manager-on-multiple-servers

JasonYoo1995 commented 2 years ago

질문의 의도

1차 캐시들 간의 일관성을 어떻게 유지하는지

트랜잭션과 Locking

Locking이 없을 때 이슈

Locking의 종류

Session vs Persistent Context

EntityManager의 생명 주기

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)

EntityManager와 트랜잭션

@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차 캐시 간 Consistency 이슈

Stack OverFlow 사례 및 답변