누구 실험해볼사람 같이 실험좀 해줘.. 아니면 내가 기능을 잘못 이해한거야?


나는 기능 이해를


"DB로부터 fetch 해온 엔티티로 2차캐쉬에 있는 데이터를 덮어씌운다는 개념" 같은데


아무리 해도 덮어씌우질 않음.


그리고 2차캐쉬에 데이터가 있는데 db로부터 fetch 를 해오는 경우부터가 이상해.


그러려면 쿼리를 직접 써서 db로부터 가져오거나,

em.find 에서 옵션으로 Retrieve를 BYPASS 주는 방법이 있어.


여기서 또 전제조건이 있는데,

1차캐쉬가 존재하면 안돼. 1차캐쉬가 존재하면 쿼리를 전부다 받아들이지 않고 1차캐쉬의 엔티티로 사용해버려.



여하튼 db의 데이터를 직접 접근하는 경우는

bypass를 주거나, 쿼리로 직접 가져오는 경우 인데



둘다 안먹히더라...



두번째 읽기를 했을 때에

2차캐쉬로부터 가져온 값이 계속 덮어씌워지지 않은 새 값이야.



누가 제발 답을 알려줘. 왜그런거야??


내 실험은 다음과 같아


첫번째 쓰레드가 데이터를 등록! 2차캐쉬에 엔티티가 등록됨.

터미널로 db에 접속해서 엔티티를 수정함.

두번째 쓰레드가 엔티티를 find! 여기서 retrieve 를 bypass를 사용하고 store를 refresh로 설정함.

(두번째 쓰레드는 수정된 엔티티를 잘 받았고, refresh로 인해 수정된 엔티티로 2차캐쉬를 덮어씌워야함)

세번째 쓰레드가 엔티티를 find! retrieve use store use 디폴트상태.

(2차캐쉬가 덮어씌워졌으므로 수정된 엔티티를 받아야 하지만 이게 웬걸!! 수정전의 2차캐쉬가 여전히 남아있음)