2011-11-20 7 views
2

Eclipse RAP 애플리케이션에서 최대 절전 모드를 사용 중입니다. 나는 데이터베이스 테이블을 Hibernate를 가진 클래스에 맵핑했다. 그리고이 클래스들은 lazily로 가져 오는 프로퍼티를 가지고있다. (lazily로 가져 오지 않았다면 아마도 첫 번째 쿼리에서 전체 데이터베이스를 메모리로로드하게 될 것이다). 나는 데이터베이스 접근을 동기화하지 않기 때문에 사용자를 위해 최대 절전 모드 Sessions이 있고 DBMS가 트랜잭션 격리를하도록한다. 즉, 가져온 데이터의 다른 인스턴스가 다른 사용자에게 속하게됩니다. 사용자가 이러한 작업을 변경하면 여러 사용자의 작업을 업데이트하고 싶습니다. 현재 이러한 상황에서 최대 절전 모드 session.refresh(object)을 사용하여 데이터를 새로 고칩니다.하지만 여러 개체를 새로 고칠 때 성능에 어떤 영향을 미치는지 또는 올바른 방법인지 확실하지 않습니다.최대 절전 모드 및 다중 스레드, 여러 사용자 간의 변경 사항 동기화

희망 사항은 분명합니다. 문제에 대한 나의 승인은 괜찮습니까? 근본적으로 결함이 있습니까? 이런 종류의 문제에 대한 일반적인 해결책이 있습니까?

이 점에 대한 의견을 보내 주시면 감사하겠습니다.

답변

1

일반적인 솔루션은

  • 트랜잭션의 라이프 사이클에 세션의 라이프 사이클을 연결하는
    • 은 가능한 한 짧게 거래를하는 것입니다 (이것은 기본값입니다 세션이 트랜잭션이 커밋 또는 롤백 때 폐쇄 back)
    • optimistic 잠금 동시성을 사용하여 두 트랜잭션이 동일한 객체를 동시에 업데이트하지 않도록합니다.

    각 트랜잭션이 매우 짧고 트랜잭션 A가 O에서 O '로 개체를 업데이트하면 동시 트랜잭션 B는 커밋되거나 롤백 될 때까지 O 만보고, A가 O' 새 세션이 트랜잭션으로 시작하기 때문입니다.

    1

    우리는 당신이 달성하고자하는 것을 정확하게 수행하는 응용 프로그램을 유지합니다. 예, 모든 session.refresh()가 데이터베이스에 도달하지만 모든 세션이 동일한 행을 동시에 새로 고치기 때문에 DB 서버는 메모리에서 이러한 모든 쿼리에 응답합니다.

    해결해야 할 유일한 사항은 무언가가 변경되어 다른 모든 세션 (심지어는 다른 호스트의 세션)으로 다시로드해야하는 정보를 전파하는 것입니다.

    우리의 응용 프로그램에는 약 30 명의 사용자가 RCP에 있으며 10-100 명의 사용자가 모두 동일한 DB 백엔드에 연결하는 RAP 인스턴스에 있습니다 (pgpool을 통해). 우리는 모든 런타임이 연결되는 소규모 네트워크 서비스를 사용합니다. 트랜잭션이 커밋 될 때 응용 프로그램은이 변경 서비스에 "테이블 T의 행 ID X"가 변경된 것을 알려주고 JVM 에서조차 다른 모든 "변경 구독자"에게 전파됩니다.

    하지만 세션에 속한 스레드 ( 일 가능성이있는 RAP 디스플레이 스레드) 내에서 session.refresh()가 호출되는지 확인하십시오. 작업 또는 관련없는 스레드에서 refresh()를 호출하지 마십시오.

    짧은 시간에 큰 수의 행을 업데이트하는 사용자가 많지 않으므로 성능에 대해 걱정할 필요가 없습니다.