2012-05-15 3 views
5

Tôi gặp vấn đề với học thuyết. Tôi thích bộ nhớ đệm, nhưng nếu tôi cập nhật một thực thể và tuôn ra, không nên doctrine2 có thể xóa bộ đệm ẩn của nó? Nếu không, bộ nhớ cache là rất ít sử dụng cho tôi kể từ khi dự án này có rất nhiều tương tác và tôi sẽ luôn luôn phải vô hiệu hóa bộ nhớ cache cho mỗi truy vấn. Người dùng sẽ không thấy tương tác của họ nếu bộ nhớ cache luôn hiển thị cho họ phiên bản cũ, được lưu trong bộ nhớ cache.Doctrine2 Caching các yếu tố cập nhật

Có cách nào không?

+0

Bạn chỉ muốn tắt hoàn toàn bộ nhớ cache? Tôi biết bạn có thể xóa bộ nhớ cache với $ deleted = $ cacheDriver-> deleteAll(); – Gohn67

+0

@ Gohn67: Làm thế nào để tôi nhận được CacheDriver? –

Trả lời

1

Điều này theo tài liệu trên Doctrine2 về cách xóa bộ nhớ cache. Tôi thậm chí không chắc chắn đây là những gì bạn muốn, nhưng tôi đoán đó là một cái gì đó để thử.

Trình điều khiển bộ nhớ cache của Doctrine2 có các mức xóa các mục được lưu trong bộ nhớ cache khác nhau.

Bạn có thể xóa bằng id trực tiếp, sử dụng một regex, bởi hậu tố, bởi tiền tố và đồng bằng cách xóa tất cả các giá trị trong bộ nhớ cache

Vì vậy, để xóa tất cả các bạn muốn làm:

$deleted = $cacheDriver->deleteAll(); 

Và xóa bởi tiền tố, bạn muốn làm:

$deleted = $cacheDriver->deleteByPrefix('users_'); 

tôi không chắc chắn như thế nào Doctrine2 tên id bộ nhớ cache của họ mặc dù, vì vậy bạn sẽ phải đào cho điều đó.

Thông tin về xóa bộ nhớ cache được tìm thấy ở đây: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting

Để có được trình điều khiển bộ nhớ cache, bạn có thể làm như sau. Nó không được mô tả trong các tài liệu, vì vậy tôi chỉ truy tìm thông qua mã một chút.

Tôi giả sử bạn có một thể hiện quản lý thực thể trong ví dụ này:

$config = $em->getConfiguration(); //Get an instance of the configuration 
$queryCacheDriver = $config->getQueryCacheImpl(); //Gets Query Cache Driver 
$metadataCacheDriver = $config->getMetadataCacheImpl(); //You probably don't need this one unless the schema changed 

Ngoài ra, tôi đoán bạn có thể tiết kiệm dụ cacheDriver trong một số loại lớp Registry và lấy nó như vậy. Nhưng tùy thuộc vào sở thích của bạn. Cá nhân tôi cố gắng không phụ thuộc vào Đăng ký quá nhiều.

Một điều khác bạn có thể làm là cho biết truy vấn bạn đang thực hiện để không sử dụng bộ nhớ cache kết quả. Một lần nữa tôi không nghĩ rằng đây là những gì bạn muốn, nhưng chỉ cần ném nó ra khỏi đó. Chủ yếu có vẻ như bạn cũng có thể tắt bộ nhớ cache truy vấn hoàn toàn. Đó là trừ khi nó chỉ là một vài truy vấn cụ thể mà bạn không muốn sử dụng bộ nhớ cache.

Ví dụ này là từ các tài liệu: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#result-cache

$query = $em->createQuery('select u from \Entities\User u'); 
$query->useResultCache(false); //Don't use query cache on this query 
$results = $query->getResult(); 
+1

Tôi tự hỏi, họ có xóa "deleteByPrefix()" trên v.2.2.2 không? Tôi đã thực hiện tìm kiếm đầy đủ về nguồn học thuyết và không thể tìm thấy phương thức này –

+0

'deleteByPrefix' không khả dụng cho trình điều khiển memcache. – Sithu

3

Bạn đang nói về việc lưu và tìm nạp một thực thể mới trong cùng một thời gian chạy (yêu cầu)? Nếu vậy thì bạn cần phải làm mới thực thể.

$entity = new Entity(); 
$em->persist($entity); 
$em->flush(); 
$em->refresh($entity); 

Nếu thực thể được quản lý và bạn thực hiện thay đổi, chúng sẽ được áp dụng cho đối tượng Entity nhưng chỉ lưu vào cơ sở dữ liệu khi gọi $ em-> flush().

Nếu bộ nhớ cache của bạn trả lại tập dữ liệu cũ cho yêu cầu mới (mặc dù nó được cập nhật thành công trong DB) thì có vẻ như bạn đã phát hiện ra lỗi. Mà bạn có thể gửi ở đây >>http://www.doctrine-project.org/jira/secure/Dashboard.jspa

+0

Tôi đã thử chính xác điều đó. Tôi tải thực thể, thực hiện thay đổi, duy trì nó, tuôn ra nó, làm mới nó. Vẫn giống nhau. Nhưng có lẽ đó là bởi vì tôi làm mới các thực thể và không phải tất cả các đối tượng liên quan của nó để các đối tượng liên quan vẫn đến từ bộ nhớ cache? –

+0

khi bạn nói "tải" thực thể, bạn có nghĩa là tạo nó hoặc lấy nó từ DB? Nếu nó được lấy sau đó nó ở trạng thái "được quản lý" và bạn không cần sử dụng phương thức persist() trên nó. Việc làm mới một thực thể được quản lý có thể xóa bất kỳ sửa đổi nào bạn đã thực hiện đối với nó. Nếu mới của nó: create -> persist -> flush -> refresh. Nếu được quản lý (được lấy từ DB): fetch -> (make changes) -> flush. –

+0

Tôi đã thử như vậy, làm mới không thực sự giúp đỡ để "chiến đấu" bộ nhớ cache. Nó hoạt động như sau: $ entity = $ service-> loadCached(); echo $ entity-> getData(); // trả về dữ liệu được lưu trong bộ nhớ cache $ em-> refresh(); echo $ entity-> getData(); // trả về dữ liệu KHÔNG được lưu trong bộ nhớ cache Âm thanh tốt, nhưng không làm mất hiệu lực bộ nhớ cache thực, vì vậy lần chạy tiếp theo của loadCached() bạn vẫn sẽ nhận được dữ liệu cũ. Có vẻ như không có cách nào khác nhưng xóa bộ nhớ cache theo cách thủ công như Gohn67 được đề xuất. –

3

Doctrine2 không bao giờ có những phương pháp xóa như deleteByPrefix, đó là trong Doctrine1 tại một số điểm (3 năm trước) và đã được gỡ bỏ bởi vì nó gây ra rắc rối hơn.

Trang http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/caching.html#deleting đã lỗi thời (Phiên bản tiếp theo của tài liệu doctrine2 sẽ thấy các phương pháp đó đã bị xóa). Điều duy nhất bạn có thể làm bây giờ là quản lý bộ nhớ cache theo cách thủ công: tìm id và xóa nó theo cách thủ công sau mỗi lần cập nhật.

Thêm bộ nhớ đệm của giáo lý nâng cao là WIP: https://github.com/doctrine/doctrine2/pull/580.

+0

Vâng, vé cũ, tôi vẫn tò mò. Tôi đang nhìn vào "deleteByPrefix", nhưng không thể tìm thấy bất cứ điều gì về nó. Nó có vấn đề gì? Vấn đề hiệu năng? Có lẽ tôi nên mở một câu hỏi mới về điều đó. – DoppyNL