2012-01-30 33 views
10

Tôi đang sử dụng RavenDB ở chế độ Trong bộ nhớ để kiểm tra đơn vị. Truy vấn của tôi được hỗ trợ bởi các chỉ mục tĩnh. Tôi không sử dụng API WaitForNonStaleResults() (tôi cũng không muốn).Chỉ số cũ nên được xử lý như thế nào trong quá trình thử nghiệm?

công việc điển hình cho một bài kiểm tra là:

  1. khởi RavenDB trong chế độ In-Memory
  2. Tích hợp chỉ sử dụng IndexCreation.CreateIndexes(Assembly, IDocumentStore)
  3. dữ liệu Insert kiểm tra (cho việc xác minh hành vi truy vấn)
  4. Chạy truy vấn
  5. Xác minh kết quả truy vấn

Tôi đã nhận thấy các bước 1-3 xảy ra quá nhanh, các chỉ mục tĩnh không có thời gian để cập nhật trước bước 4 - do đó các chỉ mục đã cũ.

Tôi đã tạo một giải pháp nhanh chóng cho việc này. Sau bước 3, tôi thực hiện:

while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0) 
    Thread.Sleep(10); 

Điều này cảm thấy cồng kềnh. Những gì tôi muốn biết là:

  • Các chỉ mục có bị tắt khi chạy RavenDB trong chế độ Trong bộ nhớ không?
  • Có cách nào tốt hơn để tránh chỉ mục cũ trong khi thử nghiệm không?

Trả lời

14

Cross-đăng này lên RavenDB usergroup và có giải pháp làm việc.

Các chỉ mục có bị tắt khi chạy RavenDB trong chế độ In-Memory không?

Có. Chỉ mục là chỉ mục.

Có cách nào tốt hơn để tránh chỉ mục cũ trong khi thử nghiệm không?

Có. Cấu hình các công ước toàn cầu khi initialising cửa hàng tài liệu:

var store = new EmbeddableDocumentStore(); 
store.RunInMemory = true; 
store.Conventions = new DocumentConvention 
{ 
    DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites 
}; 

store.Initialize(); 

Lưu ý:ConsistencyOptions.QueryYourWrites không làm việc với Map/Giảm chỉ số, ví dụ: chỉ số với một phần Reduce => .... Đối với những điều này, bạn phải sử dụng Customize(x => x.WaitForNonStale...()) khi truy vấn

Cập nhật:another approach, có thể tốt hơn (chưa thử cá nhân). Bạn có thể triển khai IDocumentQueryListener để buộc tất cả các truy vấn trả lại kết quả không cũ:

var store = new EmbeddableDocumentStore { RunInMemory = true }; 
store.Initialize(); 

store.RegisterListener(new ForceNonStaleQueryListener()); 

public class ForceNonStaleQueryListener : IDocumentQueryListener 
{ 
    public void BeforeQueryExecuted(IDocumentQueryCustomization customization) 
    { 
     queryCustomization.WaitForNonStaleResults(); 
    } 
} 
+0

@MattWarren Cảm ơn, Matt. Hữu ích để biết. –

+0

Cách tiếp cận Trình nghe không còn hợp lệ với các bản dựng RavenDB hiện tại nữa. – nathanchere

+0

@FerretallicA Tôi sẽ kiểm tra lại điều này với bản dựng mới nhất. –

Các vấn đề liên quan