2011-02-07 33 views
8

Trong ứng dụng Symfony/Doctrine của tôi, tôi có một truy vấn được đặt hàng bởi RANDOM(). Tôi gọi phương thức này giống nhau nhiều lần, nhưng có vẻ như kết quả của truy vấn đang được lưu trong bộ nhớ cache.Ngăn chặn bộ nhớ truy vấn của Doctrine trong Symfony

Đây là mã có liên quan của tôi:

$query = $table->createQuery('p') 
    ->select('p.*, RANDOM() as rnd') 
    ->orderBy('rnd') 
    ->limit(1) 
    ->useQueryCache(null) 
    ->useResultCache(null); 
$result = $query->fetchOne(); 

Thật không may, cùng một kỷ lục được trả mỗi lần, bất kể tôi đi qua null cho cả useQueryCacheuseResultCache. Tôi đã thử sử dụng false thay vì null, nhưng điều đó cũng không hoạt động. Cuối cùng, tôi cũng đã thử gọi cả hai setResultCacheLifeSpan(0)setResultCacheLifeSpan(-1), nhưng cả hai cuộc gọi đều không tạo ra sự khác biệt.

Bất kỳ thông tin chi tiết nào về cách ngăn chặn bộ nhớ đệm vì tôi muốn một hàng ngẫu nhiên khác nhau được chọn mỗi lần tôi gọi phương thức này?

Chỉnh sửa: Tôi cũng đã thử gọi clearResultCache(), nhưng điều đó vừa kết thúc gây ra lỗi nêu rõ: "Trình điều khiển kết quả Cache không được khởi tạo".

Chỉnh sửa 2: Theo yêu cầu, đây là SQL được tạo ra bằng cách gọi $query->getSqlQuery():

SELECT c.id AS c__id, c.name AS c__name, c.image_url AS c__image_url, 
c.level AS c__level, c.created_at AS c__created_at, c.updated_at 
AS c__updated_at, RANDOM() AS c__0 FROM cards c ORDER BY c__0 LIMIT 1 
+0

Xin chào Matt, bạn đã thử '$ query-> useResultCache (false)'? – Darmen

+0

Vâng, tôi đã đề cập trong câu hỏi của mình rằng tôi đã thử sử dụng sai, nhưng điều đó cũng không có tác dụng. –

+1

Tại sao vô hiệu hóa bộ nhớ cache truy vấn? Truy vấn vẫn giữ nguyên! Bạn chỉ cần xóa bộ nhớ cache kết quả. Có lẽ bạn đang có bộ nhớ cache DBMS của bạn ... bạn có thể đăng nhập truy vấn để xem một truy vấn được thực hiện cho mỗi yêu cầu. – greg0ire

Trả lời

4

Hóa ra tôi là một moron. Tôi đã cố gắng đơn giản hóa truy vấn của mình cho câu hỏi này và khi làm như vậy, tôi đã không nắm bắt được nguyên nhân thực sự. Tôi đã có một cuộc gọi where()andWhere() và kết hợp các điều kiện dẫn đến chỉ một bản ghi có thể được đối sánh. Cảm ơn bạn đã dành thời gian trả lời, mọi người, xin lỗi vì đã lãng phí thời gian của bạn!

2

Học thuyết cũng lưu trữ các thực thể bạn đã tạo trong cùng một yêu cầu/tập lệnh chạy.

Ví dụ:

$order = new Order(); 
$order->save(); 

sleep(10); // Edit this record in de DB in another procces. 

$q = new Doctrine_Query(); 
$result = $q->select() 
      ->from('Order o') 
      ->where('o.id = '.$order->id); 
$order = $result->getFirst(); 
print_r($order->toArray()); 

Các print_r sẽ không chứa những thay đổi bạn thực hiện trong giấc ngủ.

Các mã sau đây sẽ loại bỏ loại bộ nhớ cache:

$manager = Doctrine_Manager::getInstance(); 
$connection = $manager->getCurrentConnection(); 
$tables = $connection->getTables(); 
foreach ($tables as $table) { 
    $table->clear(); 
} 

PS: Thêm câu trả lời này vì tôi thấy chủ đề này cố gắng giải quyết vấn đề trên.

+0

Giải thích rất tốt. –

+0

Điều này thực sự hữu ích cho tôi và cảm ơn lời giải thích. – Thilanka

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