내 pojos 거래를 어떻게 만들려면?
-
13-09-2019 - |
문제
최대 절전 모드 및 스프링 관리 트랜잭션이있는 멀티 스레드, 멀티 서버 웹 응용 프로그램이 있습니다. 문제는 메모리 내 데이터를 유지하고 데이터베이스 상태로 최신 상태를 유지해야한다는 것입니다. 본질적으로 메모리 인 캐시를 구현하고 있습니다.
이제 메모리 내 Pojos를 최대 절전 모드/스프링 트랜잭션과 같은 수준으로 만들 수있는 방법이 있습니까? 서비스 호출은 30 개의 클래스를 깊게 계층화하고 있으며 커밋이 어디에서 일어날 지 모릅니다. 내 옵션은 무엇입니까?
해결책
내가 당신의 필요를 잘 이해한다면, 당신은 어떤 상황에서 섬세한 것을 요구하고 있습니다. 내가 시도해 보자 예를 들어, 내가 올바르게 이해하는지 확인하십시오:
- 스레드 T1은 캐시에서 pojo P를 읽고 버전 P1을 가져옵니다.
- 스레드 T2는 캐시에서 pojo P를 읽고 버전 P1을 가져옵니다.
- 스레드 T2는 트랜잭션을 시작하고 동일한 pojo를 읽고 버전 p2를 생성하는 값을 수정합니다.
- 스레드 T1은 캐시에서 pojo P를 읽고 여전히 버전 P1을 가져옵니다. 이를 위해서는 지점 3의 경우 T2가 동일한 객체가 아니라 버전 P1의 사본 P2를 받았습니다.
- 스레드 T2는 P를 저장하고 T1 또는 T2에 대해서는 아무것도 변경되지 않으며 버전이 다릅니다.
- 스레드 T2는 트랜잭션을 닫습니다.
ㅏ. 롤백 인 경우 T2는 T1과 마찬가지로 P1을 사용합니다.
비. Commit이면 T2는 P2를 계속 사용합니다. 그러나 이제 T1도 P2를 사용해야합니다.
이것이 복잡한 문제라는 것을 알 수 있습니다. 과소 평가하지 마십시오. 이미 이론적 수준에서 해결해야 할 많은 문제가 있습니다 (그리고 코딩 할 때 더 많은 것을 가질 것입니다 ...). 성공적으로 사용하려면 아키텍처가 정말 명확해야합니다. 그렇지 않다면, 당신은 당신의 정신 정신을 위험에 빠뜨립니다 ;-)
첫 번째, 당신은 당신이 정말로 그런 것을 원한다는 것을 확인해야합니다!
정말 원한다면 ..
기능 코드 에서이 까다로운 복잡성을 숨기려면 기술 코드 (AOP, Threadlocal)를 사용하는 것이 좋습니다..
Commit/Rollback이 AOP를 통해 이미 수행되었을 가능성이 있으므로 문제가되지 않습니다.
P의 인스턴스 검색을 숨기려면 (때로는 저장된 캐시의 인스턴스, 때로는 사본) : 스토어라는 클래스를 사용하여 캐시에 값을 저장하고, 유형 스토어의 스레드 로컬 변수를 갖습니다. 현재 스레드에 threadLocal 변수를 사용합니다.
- 스토어 인스턴스는 기능 코드가 아닌 트랜잭션 AOP 코드에서만 변경할 수 있습니다.
- 기능 코드는 현재 ThreadLocal 인스턴스를 사용하여 엔티티 (저장 등)를 조작합니다.
- 언제 거래 밖에서, ThreadLocal 인스턴스는 캐시 된 인스턴스이며 캐시라고합시다.
- 거래 입력 현재 스레드에 대해 다른 threadLocal 인스턴스를 설정합니다. 그 클래스는 상점의 서브 클래스이며, 당신이 그들을 요구할 때 캐시 대상의 사본을 반환합니다. 수업은 또한 일부가 저장되면 암기합니다 (이 특별한 API를 사용하여 저장하거나 정기적으로 저장 API에서 알리도록해야합니다).
- 롤백 트랜잭션은 ThreadLocal 인스턴스를 버리고 현재 스레드를 위해 캐시 된 인스턴스를 다시 설치합니다.
- 저작 트랜잭션은 ThreadLocal 인스턴스에서 모든 암기 된 데이터베이스 작업을 수행하고 캐시 된 인스턴스를 수정하려면 적용하고 현재 스레드의 캐시 인스턴스를 다시 설치합니다.
다른 팁
최대 절전 모드를 사용합니다 2 레벨 캐시 요구 사항을 충족하지 않습니까? Jboss Cache 제공 업체는 분산 및 트랜잭션입니다.
그것이 당신에게 효과가 없다면, 당신은 의미있는 반응을 얻기 위해 왜 그리고 당신이 실제로 달성하려는 이유와 무엇을 설명해야 할 것입니다.