2011-10-22 3 views
4

우리는 Azure Table Storge에 읽기 및 쓰기를 병렬 처리하는 솔루션을 제공합니다.추적되지 않은 Azure 테이블 저장소 엔터티의 ETag를 얻는 방법은 무엇입니까?

TableServiceContext는 한 스레드에서 엔티티를 읽고 다른 스레드에 저장하는 것을 지원하지 않기 때문에 다른 Context를 사용하여 엔티티를 유지하려고합니다.

context.MergeOption = MergeOption.NoTracking; 

을 그리고 엔티티를 업데이트 (또는 제거) 할 때 우리가 전화 : 그러나

context.AttachTo(entitySetName, entity, eTag); 

우리가있는 ETag를 알 필요가 그렇게하고, 그렇게하지 우리가 설정해야 할 것을해야 할 일 그것을 얻는 방법을 아십시오.

private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity 
{ 
    return context.Entities.Single(entityDescriptor => 
            entityDescriptor.Entity == entity).ETag; 
} 

을 ...하지만 우리가 실체를 추적하지 않기 때문에 context.Entities 비어 있습니다 : 엔티티 추적 경우

, 우리는이 같은 EntityDesciptor.ETag를 사용할 수 있습니다.

context.AttachTo(entitySetName, entity, "*"); 

...하지만 마지막 승리 항상 쓰기 위치를 우리가 동시성 문제가 의미

우리가 발견 한 유일한 해결책은 그래서 요금입니다.

private string GetETagFromEntity<T>(T entity) where T : TableServiceEntity 
{ 
    string datePart = entity.Timestamp.ToString("yyyy-MM-dd"); 
    string hourPart = entity.Timestamp.ToString("HH"); 
    string minutePart = entity.Timestamp.ToString("mm"); 
    string secondPart = entity.Timestamp.ToString("ss"); 
    string milisecondPart = entity.Timestamp.ToString("fff").TrimEnd('0'); 

    return string.Format(
       "W/\"datetime'{0}T{1}%3A{2}%3A{3}.{4}Z'\"", 
       datePart, 
       hourPart, 
       minutePart, 
       secondPart, 
       milisecondPart 
      ).Replace(".Z", "Z"); 
} 

우리가 얻을 작동 할 수있는 경우에도이 방식의 일반적인 문제는, 마이크로 소프트가 없다는 것입니다 :

우리는하지만 클라우드 로컬 계산 에뮬레이터에서 작동 다음을 구성하려 ETag가 어떻게 보이는지에 관해서는 어떤 보증도하지 마십시오. 그래서 이것은 시간이 지남에 따라 변할 수 있습니다.

그래서 질문입니다 : 추적되지 않은 Azure 테이블 저장소 엔터티의 ETag를 얻으려면 어떻게해야합니까?

답변

2

엔티티를 읽을 때 etag에주의해야합니다. (어쩌면 당신이 어딘가에 접근 할 수있는 이벤트가있을 것입니다. 어디에서 etag에 접근하여 어딘가에 저장할 수 있습니다.)

+0

감사 ...이 답변을 정답으로 표시했습니다. 당신은 때라도 (추한) 코드 ReadingEntity 이벤트에 ETAG 얻을 수 있습니다 : 무효 OnContextReadingEntity (개체를 보낸 사람, ReadingWritingEntityEventArgs 전자) { 문자열 ETAG = e.Data.FirstAttribute.Value을; } 매우 느립니다. 몇 초 걸리던 작업이 2 분이 소요됩니다! –

+0

감속 (아마도 새로운 질문)에 대해 더 자세히 설명하십시오. 왜이 이벤트를 후킹하는 것이 성능에 영향을 미치는지 나는 알지 못합니다. – smarx

0

나는 etag 노출에 매우 명시적인 문맥 자유로운 대체 테이블 스토리지 클라이언트를 작성했습니다. 스레드로부터 안전합니다. 그것은 일 수 있습니다 당신을 위해 작동합니다. www.lucifure.com에서 다운로드 할 수 있습니다.

관련 문제