문제

최대 절전 모드 및 스프링 관리 트랜잭션이있는 멀티 스레드, 멀티 서버 웹 응용 프로그램이 있습니다. 문제는 메모리 내 데이터를 유지하고 데이터베이스 상태로 최신 상태를 유지해야한다는 것입니다. 본질적으로 메모리 인 캐시를 구현하고 있습니다.

이제 메모리 내 Pojos를 최대 절전 모드/스프링 트랜잭션과 같은 수준으로 만들 수있는 방법이 있습니까? 서비스 호출은 30 개의 클래스를 깊게 계층화하고 있으며 커밋이 어디에서 일어날 지 모릅니다. 내 옵션은 무엇입니까?

도움이 되었습니까?

해결책

내가 당신의 필요를 잘 이해한다면, 당신은 어떤 상황에서 섬세한 것을 요구하고 있습니다. 내가 시도해 보자 예를 들어, 내가 올바르게 이해하는지 확인하십시오:

  1. 스레드 T1은 캐시에서 pojo P를 읽고 버전 P1을 가져옵니다.
  2. 스레드 T2는 캐시에서 pojo P를 읽고 버전 P1을 가져옵니다.
  3. 스레드 T2는 트랜잭션을 시작하고 동일한 pojo를 읽고 버전 p2를 생성하는 값을 수정합니다.
  4. 스레드 T1은 캐시에서 pojo P를 읽고 여전히 버전 P1을 가져옵니다. 이를 위해서는 지점 3의 경우 T2가 동일한 객체가 아니라 버전 P1의 사본 P2를 받았습니다.
  5. 스레드 T2는 P를 저장하고 T1 또는 T2에 대해서는 아무것도 변경되지 않으며 버전이 다릅니다.
  6. 스레드 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 제공 업체는 분산 및 트랜잭션입니다.

그것이 당신에게 효과가 없다면, 당신은 의미있는 반응을 얻기 위해 왜 그리고 당신이 실제로 달성하려는 이유와 무엇을 설명해야 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top