2017-11-01 15 views
1

분산 웹 서비스 (dropwizard/jdbi)가 있습니다. 롤 메모리와 대응하는 학생들의지도를 말하면서 메모리 캐시를 유지할 것입니다.dropwizard/jdbi 웹 서비스에서 메모리 캐시를 올바르게 업데이트합니다.

이러한 개체는 여러 DAO의 데이터로 작성됩니다. 따라서 학생 업데이트가 발생하면 해당 MySQL 테이블을 업데이트하기 위해 트랜잭션 using @Transactional with @CreateSqlUpdate in jdbi을 수행해야합니다. 또한 업데이트시 캐시 또는 맵을 무효화해야합니다.

제 질문은이 캐시 업데이트/무효화가 거래의 일부가되어야한다는 것입니다. 데이터베이스 업데이트가 발생하면 캐시 무효화 만 발생하고 데이터베이스 업데이트가 발생하지만 캐시 업데이트가 실패하면 데이터베이스가 롤백됩니다. 여기서 염두에 두어야 할 동시성/일관성 문제는 무엇입니까?

답변

1

하나의 옵션은 엔티티에 버전 관리를 추가하는 것입니다 (예 : int Student#getVersion()). 이는 students 테이블로 유지됩니다.

이 방법으로 작동합니다 : 각 쓰기 tx에서 서비스는 클라이언트에서받은 새 버전이 "캐시 된 버전 +1"인지 확인해야하며, 그렇지 않은 경우 쓰기 tx를 중단합니다 (클라이언트에 유익한 예외 제공).

모두 정상이면 tx 커밋 성공 후 캐시를 버전 +1로 업데이트해야합니다.

귀하의 SQL update 문은 데이터베이스 서비스 캐시보다 버전이 최신이 포함 된 경우 (아마도 인해 이전 캐시 실패) 감지하고 그에 따라 행동 할 수 있도록 X 현재 캐시 된 버전이다 ... AND student.version = X를 포함해야합니다 (즉, 캐시를 새로 고침 DB에서 현재 버전으로 변경하고이 보류중인 쓰기를 거부합니다.

이렇게하면 캐시 업데이트 실패로 인해 캐시 된 버전이 고쳐지지 않으면 쓰기 tx에서이를 감지 할 수 있습니다. 캐시 업데이트에 실패하면 tx를 롤백 할 필요가 없습니다. 결국 클라이언트의 잘못이 아닙니다.

+0

이 제안에 감사드립니다. 그러나 현재 캐시에 버전을 채택 할 자유가 있는지 확신 할 수 없습니다. 또 하나의 점은 동시성 (concurrency) 지점에서입니다. 트랜잭션 완료 후에 만 ​​캐시 무효화가 발생한다는 것을 확실하게해야합니까? – Deven

+0

위의 솔루션에서 tx committed 후 캐시를 업데이트 할 수 있습니다. 오류가 없으면 tx 시간이 최소화됩니다. 클라이언트 데이터와 데이터베이스 데이터 간의 버전 불일치로 인해 다음 쓰기 tx에서 캐시 업데이트 실패를 감지합니다. –