2012-10-23 35 views
30

Tôi sử dụng công cụ lập bản đồ để trả về các đối tượng từ cơ sở dữ liệu của tôi dưới dạng IEnumerable. Theo mặc định, người lập bản đồ có cài đặt bộ đệm được đặt thành true.Giải thích về bộ nhớ đệm/bộ nhớ đệm độc lập

Tính năng này hoạt động như thế nào?

Nếu dapper cache truy vấn đầu tiên và sau đó lấy các đối tượng từ bộ nhớ.

Điều gì sẽ xảy ra nếu ai đó chỉnh sửa/xóa/thêm hàng trong bảng. Phải dapper recache tất cả dữ liệu một lần nữa cho truy vấn này?

Trả lời

44

Bộ đệm không liên quan đến bộ nhớ cache. Dapper không bao gồm bất kỳ loại cache dữ liệu nào (mặc dù nó có cache liên quan đến cách xử lý các lệnh, tức là "chuỗi lệnh này, với kiểu tham số này, và kiểu thực thể này - có các phương thức được tạo động liên quan để cấu hình lệnh và điền các đối tượng ").

gì chuyển đổi này thực sự có nghĩa là:

  • false: sẽ lặp mục như họ đang nhận được/tiêu thụ - về cơ bản, một iterator khối xung quanh một trừ IDataReader
    • : bạn chỉ có thể lặp nó một lần (trừ khi bạn sẵn sàng chạy lại truy vấn)
    • cộng: bạn có thể lặp qua bao la truy vấn (nhiều triệu hàng), mà không cần tất cả chúng trong bộ nhớ cùng một lúc - vì bạn chỉ thực sự tìm kiếm ở lề đường hàng thuê được mang lại
    • cộng với: bạn không cần phải đợi cho đến cuối dữ liệu để bắt đầu lặp lại - ngay khi có ít nhất một hàng, bạn nên đi theo số
    • trừ: kết nối là sử dụng trong khi bạn đang lặp, điều này có thể dẫn đến "đã có một trình đọc mở trên kết nối" (hoặc bất kỳ từ ngữ chính xác nào) nếu bạn cố gắng gọi các lệnh khác trên cơ sở mỗi hàng (điều này có thể giảm nhẹ bởi MARS)
    • trừ: vì người tiêu dùng có thể làm bất cứ điều gì họ muốn mỗi mục (nó có thể mất vài phút cho mỗi hàng, nếu họ đang làm một cái gì đó phức tạp), lệnh/người đọc có thể được mở lâu hơn
  • true (mặc định): dữ liệu là hoàn toàn tiêu thụ thành một List<T> trước khi nó trao nó lại cho bạn
    • cộng: bạn có thể lặp lại nó nhiều lần như bạn muốn
    • trừ: nếu truy vấn là mênh mông, bốc tất cả chúng vào bộ nhớ (trong danh sách) có thể tốn kém/không thể
    • trừ: nếu truy vấn lớn, có thể có độ trễ đáng chú ý khi thu thập hàng cuối cùng
    • plus: khi bạn nhận được dữ liệu, lệnh hoàn chỉnh - vì vậy không có xung đột nào giữa hoạt động đó và các hoạt động tiếp theo
    • cộng với: ngay sau khi bạn nhận được dữ liệu, lệnh đã phát hành bất kỳ tài nguyên (ổ khóa vv), vì vậy bạn có tác động tối thiểu trên máy chủ

Hầu hết các truy vấn chỉ trả lại một lượng vừa phải dữ liệu (chẳng hạn, ít hơn 100 hồ sơ), vì vậy chúng tôi rất vui vì mặc định (true) mang lại hành vi thích hợp nhất cho hầu hết các trường hợp. Nhưng chúng tôi cung cấp tùy chọn có sẵn cho bạn, để phục vụ cho các tình huống sử dụng khác nhau.