2014-12-18 2 views
1

내 응용 프로그램에서 값을 업데이트하려고 시도하고 있습니다.이 객체를 Foo 객체라고 부를 수 있습니다. Foo는 자바 객체로 변경할 수 없지만 Hibernate 엔티티를 통해 데이터베이스에서 업데이트 될 수 있습니다. 나는 존재하지 않을 때 데이터베이스에서 값을로드하는로드 캐시 오버레이 (Guava 캐시 구현)를 호출하여 Foo 객체에 액세스하고 있습니다. 또한 동시 쓰기가 가능하지만 쓰기는 거의 없지만 Foo 객체에 대한 읽기는 많습니다.캐시 된 Java 객체를 동시에 업데이트하는 방법

Foo 개체를 업데이트하는 가장 좋은 방법은 무엇입니까? 업데이트시 캐시 잠금? 다른 구조 설계?

광대 한 인터넷에서이 주제에 대한 정보가 분명히 있음을 유의하십시오. 그러나이 내용을 너무 많이 읽으므로 혼란스러워 보입니다. 현재 캐시 구현 클래스의 업데이트 메소드에 대해 ReentrantLock을 사용하고 있지만 더 좋은 방법이 있어야합니다.

+0

"불변"개체가 변경되었음을 응용 프로그램의 여러 부분에서 알고 있어야합니까? –

+0

@ ThorbjørnRavnAndersen, 아니, 다른 "작가"가 개체를 업데이트 할 때 경쟁 조건이 없도록 알아야하는 경우가 아니라면 그렇게 생각하지 않습니다. – oberger

+1

일반적인 해결책은 객체가 업데이트 될 때 이벤트가 시작되도록하는 것입니다. 그렇게하려면 큰 코드베이스의 예를 보려면 스윙을 참조하십시오. 잠금과 동기화를 사용하여 업데이트가 중복되지 않도록 할 수 있습니다. –

답변

0

나는 귀하의 질문에 대한 권리가 있는지 완전히 확신하지 못합니다. 그러나이 문제는 내가 대답 한 것과 동일하거나 비슷한 것으로 보입니다. Guava Cache, how to block access while doing removal

그렇지 않은 경우 더 자세히 입력하십시오.

+0

데이터를 "만져서"트랜잭션을 시작하는 방법 (링크 1에서 솔루션 1)에 대해 조금 더 자세히 설명 할 수 있지만 여전히 데이터 계층에서 추상화를 유지하고 있습니까? 나는 비즈니스 계층에서 데이터 계층으로의 두 왕복 여행이 모두 한 거래에서 이루어지는 것처럼 보이는 것을 어떻게 이해하는지 모르겠다. – oberger

+0

이것은 실제로 설계상의 문제로 보입니다. 그러나 잠금은 문제를 해결하고 해결해야합니다 ... 세 번째 해결 방법을 시도 하겠지만 업데이트 전용 채널을 사용하면 DB로부터의 읽기가 전에 발생합니다 또는 Hibernate가 자동 업데이트를 릴리즈 한 후, 나는 괜찮다. 또한, 나는 귀하의 빠르고 더러운 솔루션을 좋아하지만, 스트라이프 을 구아바에서 사용하고 있습니다. – oberger

관련 문제