2013-03-10 7 views
0

db4o에서는 내부 커밋 타임 스탬프 (버전 8.0 이후로 db4o가 커밋 타임 스탬프를 생성 할 수 있기 때문에)를 사용하여 특정 시간 이후에 변경된 개체를 쿼리 할 수 ​​있습니까? 커밋 타임 스탬프로 개체 쿼리

나는 그것의 가능한이 방법을 알고 :

long last = DateTime.Now.Ticks; 
var objectsChanged = from obj in GetAllObjectsInDatabase(session) 
        where session.Ext().GetObjectInfo(obj).GetCommitTimestamp() > last 
        select obj; 

하지만 10milion 개체에 대한, 그것은 (결과 3 개체를 얻을 수) 모두 반복하는 나이 소요 - 각에 만들 훨씬 빠른 것 내 자신의 커밋 타임 스탬프 및 인덱스 개체.

특정 순간 이후로 DB에서 변경하는 더 빠른 방법이 있습니까?

답변

1

흠. 공식적으로 아닙니다. 그러나 dRS는 복제를 위해이 작업을 수행해야합니다 (source). 따라서 내부적으로 지원됩니다. 나는 그것을 제대로 검사하지 않았다. 복제 코드에서 제거됩니다.

자바 :

Query query = container.query(); 
query.descend(VirtualField.COMMIT_TIMESTAMP) 
    .constrain(lastCommitTimestamp).greater(); 
List<Object> result = query.execute(); 

그래서 C#으로 그것이 있어야 :

IQuery query = container.Query(); 
query.Descend(VirtualField.COMMIT_TIMESTAMP) 
    .Constrain(lastCommitTimestamp).Greater(); 
IList result = query.execute(); 

어쨌든, 아니 수혜자. 공개 API로 간주되지 않습니다. 그러나 나는 당신이 필요로하는 것에 아주 가깝다고 생각합니다.

+0

고마워,이 하나의 작품 : IQuery query = session.Query(); query.Descend (VirtualField.CommitTimestamp) .Constrain (ticks) .Greater(); –