2012-06-30 6 views
0

우리는 자바 애플리케이션을 위해 Spring과 함께 Hibernate를 사용하고있다. 세션에서 데이터베이스의 내용을 업데이트하면 다른 세션에서 업데이트를 볼 수 없습니다. 예를 들어 user1은 데이터베이스에서 계정 잔액을 가져오고 user2는 잔액을 늘립니다. user1이 개체를 다른 시간에 가져 오면 업데이트하기 전에 계좌 잔액을 봅니다 (세션에서 캐시의 값을 사용하는 것으로 보입니다).하지만 업데이트 된 개체를 가져 오려고합니다. 새로운 계좌 잔액. User1은 user2 세션과 다른 모든 활동 중에 하나의 세션을 사용합니다. 데이터베이스에서 업데이트 된 개체를 가져 오도록 구성해야합니까? 또는 다른 도움?Hibernate + Spring + session + cache

+0

DB를 사용하여 수행하는 각 트랜잭션을 커밋합니다. – Ved

+0

두 클라이언트의 열기/닫기, 선택/업데이트/삽입 시간 및 사용하는 트랜잭션 격리 수준과 관련하여 트랜잭션/세션 경계와 관련하여 좀 더 자세히 설명하십시오. – tscho

답변

1

이는 의도적으로 설계된 것입니다 (세션을 "작업 단위"로 생각하십시오). 세션은 트랜잭션 방식으로 격리되어야합니다. 그것은 세션이 짧아야한다는 많은 이유 중 하나입니다. 오랫동안 살았던 세션을 사용하는 것처럼 나에게 들립니다.

어떤 경우에도 "다른 세션"(귀하의 경우 사용자 1)을 에 새로 입력하여session.refresh(theAccount);을 사용하여 계정 상태를 새로 고침 할 수 있습니다. 계정을 새로 고칠 때도 새로 고쳐야하는 종속 상태가 필요하면 새로 고침도 계단식 작업입니다 ...

0

모든 활동에 대해 단일 세션을 사용하는 경우보고있는 내용을 사용해야합니다.

세션 1은 세션 2에 의해 변경된 개체를로드합니다. 그러나 세션 1은 세션 (첫 번째 수준) 캐시에 여전히 열려 있습니다. session.clear()을 사용하여 Session1을 새로 고칠 수 있습니다. 그러면 개체를 다시로드하면 업데이트 된 버전을 얻을 수 있습니다.

+0

마지막 문장은 계정의 이전 상태를 지우고 데이터베이스 *에서 새 버전 * –

+0

으로 다시로드했기 때문에 사용자가 제안한 경우 정확한 Alex가 아닙니다. 그것은 다시로드하지 않고 동일한 객체를 공유하는 것을 기반으로했습니다. 나는 분명해야했다. –

+0

어쨌든 값을 추가하지 않았기 때문에 제거했습니다! –