2011-06-20 37 views
13

Tôi đã được xem xét thực hiện ehcache trong các đối tượng miền Grails của tôi như thế này:Caching đối tượng miền trong Grails

static mapping = { 
    cache true 
} 

Tôi không quá quen thuộc với chính xác cách cơ chế bộ nhớ đệm này hoạt động và đã tự hỏi những gì một nguyên tắc nhỏ là xác định đối tượng miền nào sẽ được hưởng lợi từ việc lưu vào bộ nhớ cache. ví dụ, các đối tượng được truy cập hiếm khi .. thường ...?

Cảm ơn!

Trả lời

27

Caching chỉ hoạt động cho get() cuộc gọi theo mặc định, nhưng truy vấn sử dụng bộ đệm truy vấn nếu bạn cập nhật chúng với cache: true (tiêu chí và HQL).

cache true tạo ra một đọc-ghi bộ nhớ cache nhưng bạn có thể cấu hình một bộ nhớ cache read-only với

static mapping = { 
    cache usage:'read-only' 
} 

Cache chỉ đọc là tốt cho dữ liệu tra cứu mà không bao giờ thay đổi, đối với các quốc gia ví dụ, các nước, vai trò, vv ..

Nếu bạn có các lớp miền cập nhật, tạo hoặc xóa thường xuyên, truy vấn bộ nhớ cache thường sẽ chậm hơn không lưu vào bộ nhớ đệm. Điều này là do những thay đổi như thế này khiến tất cả truy vấn được lưu trong bộ nhớ cache bị xóa, vì vậy bạn thường truy cập trực tiếp vào cơ sở dữ liệu. Xem http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ để biết mô tả chi tiết hơn về điều này. Vì lý do này, tôi hiếm khi sử dụng bộ nhớ đệm truy vấn và thường vô hiệu hóa nó hoàn toàn với các lớp

hibernate { 
    cache.use_second_level_cache=true 
    cache.use_query_cache=false 
    cache.provider_class='org.hibernate.cache.EhCacheProvider' 
} 

Domain mà là "đọc chủ yếu" là những ứng cử viên tốt nhất cho đọc-ghi bộ nhớ đệm. Các bộ nhớ cache được xóa cho mỗi lần cập nhật, tạo và xóa, nhưng nếu những phần này hiếm khi bạn sẽ thấy hiệu suất tổng thể tăng lên.

Hibernate có API để giám sát việc sử dụng bộ nhớ cache. Các tiện ích http://grails.org/plugin/app-infohttp://grails.org/plugin/hibernate-stats làm cho thông tin có sẵn và bạn có thể sử dụng cách tiếp cận ở đó trong mã của riêng bạn.

+0

Cảm ơn! Lời giải thích tuyệt vời. – RyanLynch

+1

Có cách nào để bộ nhớ cache hết thời gian chờ và đọc lại không? I E. chỉ định tuổi tối đa? Grails caching có vẻ rất cơ bản. Tôi thấy có một số plugin ehcache, bao gồm "Ehcache Cache Plugin được Pivotal hỗ trợ", nhưng không rõ cách này sẽ tương tác hoặc can thiệp với grails được xây dựng trong bộ nhớ đệm miền thông qua hibernate thông qua bộ nhớ đệm (xuất hiện cũng là ehcache). –

+1

Hey Burt, Có thể tách biệt Domain cach cache thông qua các vùng ngủ đông không? Điều này có nghĩa là bản cập nhật trong một tên miền không dẫn đến việc xóa bộ đệm truy vấn của tất cả các miền khác. –

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