2013-04-23 3 views
1

데이터베이스에 액세스하기 위해 Entity Framework를 사용하는 .net 클라이언트 응용 프로그램을 개발 중입니다. 다중 사용자 응용 프로그램으로 (때로는) 몇 시간 동안 변경 사항이 없으며 한 번에 수백 개의 변경 사항이있는 경우도 있습니다.데이터베이스 변경시 캐시 다시로드

사용자에게 표시하고 수행해야하는 검사가 있기 때문에 꽤 많은 데이터를 캐시해야합니다. 한 응용 프로그램 인스턴스 내에서 무언가가 바뀌면 다른 캐시를 업데이트하는 캐시 문제를 해결했습니다. 그러나 응용 프로그램의 다른 인스턴스에서 변경이 발생할 때 가장 좋은 방법은 무엇인지 확신 할 수 없습니다.

SqlDependency을 사용하여 내 캐시를 무효화하려고했지만 한 비트 만 변경된 경우 대용량 데이터를 다시로드해야합니다. 성능면에서는별로 좋지 않습니다. 또한 SqlDependecy을 사용하는 응용 프로그램에서 데이터를 변경하면 한 번의 변경으로 캐시가 두 번 업데이트됩니다.

나는 캐싱의 양으로 무언가를 개발하지 않았기 때문에 나는 최선의 방법을 잃었습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

왜 단일 비트를 변경하면 많은 양의 데이터를 다시로드해야합니까? – Paparazzi

+0

어쩌면 내가 뭔가 잘못하고 있지만 알림을 받았을 때 정확히 무엇이 변경되었는지 알 수 없어 변경된 데이터를 다시로드 할 수 없습니다. SqlCommand에서 변경 될 수있는 모든 것을 다시 적용해야합니다. 예를 들어 테이블 'A'의 모든 요소는 fk ... = x입니다. 꽤 많은 데이터가 될 수 있습니다. – Patrick

+0

이해하지만 단일 비트가 여전히 모든 데이터를 다시로드하도록 강요하지는 않습니다. 읽은 데이터를 읽고 변경된 데이터 만 업데이트 할 수 있습니다. 또는 변경 사항을 기록하는 SQL에 트리거를 구현하여 해당 테이블 만 확인하면됩니다. – Paparazzi

답변

1

단일 비트가 여전히 모든 데이터를 다시로드하도록 강요하지 않습니다.
데이터 읽기를 읽을 수 있으며 변경된 데이터 만 업데이트 할 수 있습니다.

또는 변경 사항을 기록하는 SQL에 트리거를 구현하여 해당 테이블 만 확인하면됩니다.
여러 클라이언트가 트리거 테이블에서 동기화하는 경우 클라이언트가 가져온 것을 나타낼 수있는 다른 FK 테이블을 가질 수 있습니다.
야간처럼 물건을 정리하십시오.

+0

당신의 대답은 분명히 나를 잡았습니다. 나는 SQL Server (2008 R2 이상)에서 제공하는 트리거 또는 변경 추적을 사용해야하는지 잘 모르겠습니다. 트리거를 사용하는 솔루션을 사용하면 더 많은 제어가 가능하지만 모든 테이블에서이를 수행해야합니다. 아니면 모든 테이블에 대해 하나의 트리거로 처리 할 수 ​​있습니까? (저는 전에는 트리거를 사용하지 않았습니다) – Patrick

+1

나는 둘 다 제안하고 있습니다. 통지 추적을 변경하십시오. 그런 다음 어떤 데이터가 변경되었는지 식별하십시오. 나는 당신이 모든 테이블과 의심에 대해 하나의 방아쇠를 가질 수 있다고 생각하지 않는다. 그것은 어쨌든 최상의 솔루션이다. 물론 사용자가 업데이트하지 않는 테이블이 있습니다. 트리거 테이블이 실행되는 것을 원하지 않습니다. 같은 테이블에 여러 개의 트리거를 쓸 수 있습니다. – Paparazzi

관련 문제