2012-04-07 29 views
6

Tôi có một kho lưu trữ nơi tôi đang cố gắng thiết lập bộ nhớ đệm kết quả. Tôi chỉ có thể tìm thấy một ví dụ trực tuyến về cách thực hiện điều này ... nhưng khi tôi triển khai ví dụ tại một trong các kho lưu trữ của mình, tôi gặp lỗi. Tôi đang sử dụng APC cho bộ nhớ đệm của mình và đã bật bộ nhớ truy vấn để sử dụng APC trong tệp config.yml của mình. Tôi đã phân bổ 512M để APC và chỉ sử dụng nó 50M hiện (23m của việc này là để nhập bộ nhớ cache không đơn này)Làm cách nào để chỉ định bộ nhớ đệm kết quả truy vấn trong kho lưu trữ symfony2?

Dưới đây là mã kho tôi có:

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getResult(); 
     return $result; 
    } 
} 

Và khi điều này được thực hiện tôi nhận được các lỗi sau

Notice: apc_store() [<a href='function.apc-store'>function.apc-store</a>]: &quot;type&quot; returned as member variable from __sleep() but does not exist in /data/www/ftw2/Symfony/vendor/doctrine-common/lib/Doctrine/Common/Cache/ApcCache.php line 80 

Khi tôi nhìn vào tập tin apc.php của tôi để xem những gì đang lưu trữ, tôi thấy mục bộ nhớ cache của tôi trong phần sử dụng bộ nhớ cache với một giá trị được lưu trữ của

Fatal error: Nesting level too deep - recursive dependency? in /data/www/localhost/apc.php on line 1000 

Có ai có thể cung cấp cho tôi một số hướng đi đến nơi tôi đã đi sai không?

Có một vài cột trong thực thể này là ManyToOne, tôi có cần vô hiệu hóa tải lười trên truy vấn này để hoạt động không? Nếu vậy ... làm thế nào? EDIT: Tôi cho phép tải háo hức bằng cách thêm, lấy = "háo hức" để lập bản đồ ManyToOne của tôi ... không có táo :(

EDIT # 2: TRẢ LỜI - Working mã lớp (lưu ý, tất cả các thuộc tính của lớp thực thể (Achievement) đã được thay đổi để bảo vệ)

class AchievementRepository extends EntityRepository 
{ 
    function findAchievementsByCategory($categoryObj) 
    { 
     $em=$this->getEntityManager()->createQuery("SELECT a FROM FTWGuildBundle:Achievement a where a.category=:category order by a.title") 
      ->setParameter('category',$categoryObj); 
     $em->useResultCache(true,3600,'findAchievementsByCategory'); 
     $result=$em->getArrayResult(); 
     return $result; 
    } 
} 

Trả lời

3

khi thuyết lưu trữ một thực thể, nó tiết kiệm tình trạng serialized của nó. vấn đề là, tài sản tư nhân (khả năng hiển thị mặc định khi tạo ra bởi Học thuyết) có thể không được đăng. để sửa lỗi này, bạn phải bảo vệ tài sản thực thể của mình. Thông tin thêm: http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html#merging-entities

Điều khác là a know issue đó là (cuối cùng) được sửa trong Doctrine phiên bản 2.2, sẽ có trong Symfony 2.1. Nếu bạn không thể nâng cấp vì một số lý do, cách duy nhất để kết hợp bộ nhớ cache là sử dụng getArrayResult thay vì điền các thực thể.

+0

Cảm ơn! Tôi cập nhật để sử dụng tài sản được bảo vệ và thay đổi getResult() của tôi thành getArrayResult() và nó bây giờ lưu trữ chính xác. – Chris

+0

@Chris, bạn đã kiểm tra kết quả được lưu trong bộ nhớ cache như thế nào? – cbacelar

+0

@cbacelar - một vài cách 1) Sử dụng trình gỡ rối truy vấn, hiển thị một trang và xem có bao nhiêu truy vấn nào đang chạy. Bạn sẽ thấy các truy vấn không được lưu trong bộ nhớ cache của mình tại đây. Làm mới trang và bạn sẽ thấy các truy vấn được lưu trong bộ nhớ cache không được thực hiện. 2) Kiểm tra số liệu thống kê trên bộ nhớ cache của bạn (memcached, apc, v.v.) để xem liệu có nhiều dữ liệu hơn hoặc nhiều bản ghi hơn trong bộ nhớ cache hay không. apc có giao diện đẹp, bạn có thể cài đặt để cho phép bạn xem từng thực thể trong bộ nhớ cache (bao gồm khóa, giá trị và số liệu thống kê) – Chris

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