Thiết lập bộ nhớ đệm

Hãy quay lại cài đặt bộ nhớ đệm trong tệp hibernate.cfg.xml:

<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

Hãy chú ý đến dòng đầu tiên - nó chứa tên của lớp công cụ lưu trữ. Hibernate không thực sự triển khai bộ nhớ đệm bên trong, thay vào đó, nó cung cấp một tập hợp các giao diện mà bạn có thể triển khai công cụ bộ nhớ đệm của riêng mình.

Các triển khai phổ biến bao gồm:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Nó có thể được lưu vào bộ nhớ cache trong bộ nhớ hoặc trên đĩa, cũng như trong bộ nhớ đệm theo cụm và cũng hỗ trợ bộ đệm tùy chọn cho các kết quả truy vấn Hibernate.

OSCache

Hỗ trợ bộ nhớ đệm và bộ đệm đĩa trong cùng một JVM với một bộ chính sách hết hạn phong phú và hỗ trợ bộ đệm truy vấn.

SwarmCache

Bộ đệm cụm dựa trên JGroups. Nó sử dụng vô hiệu hóa cụm nhưng không hỗ trợ bộ đệm truy vấn Hibernate.

Bộ nhớ đệm JBoss

Bộ nhớ cache phân cụm được sao chép hoàn toàn theo giao dịch, cũng dựa trên thư viện phát đa hướng của JGroups. Nó hỗ trợ sao chép hoặc vô hiệu hóa, giao tiếp đồng bộ hoặc không đồng bộ và khóa lạc quan và bi quan. Bộ đệm truy vấn ngủ đông được hỗ trợ.

Các công cụ này không hỗ trợ tất cả các chiến lược truy cập song song. Tình hình thực tế được mô tả trong bảng dưới đây:

Chiến lược/Nhà cung cấp Chỉ đọc đọc-ghi không nghiêm ngặt đọc viết giao dịch
EHCache X X X
OSCache X X X
SwarmCache X X
Bộ nhớ đệm JBoss X X

Ví dụ cấu hình EHCache

Công cụ EHCache có tệp cấu hình riêng gọi là ehcache.xml. Nội dung gần đúng của một tệp như vậy:

<diskStore path="java.io.tmpdir"/>

<defaultCache
    maxElementsInMemory = "1000"
    eternal = "false"
    timeToIdleSeconds = "120"
    timeToLiveSeconds = "120"
    overflowToDisk = "true"
/>

<cache name = "Employee"
    maxElementsInMemory = "500"
    eternal = "true"
    timeToIdleSeconds = "0"
    timeToLiveSeconds = "0"
    overflowToDisk = "false"
/>

Tại đây, bạn có thể định cấu hình cài đặt bộ nhớ đệm nói chung và cho từng thực thể riêng biệt. Đọc thêm trong tài liệu chính thức .

Phân tích thống kê bộ nhớ đệm

Bạn cũng có thể cần kiểm tra cơ chế bộ nhớ đệm được cấu hình tốt như thế nào. Hibernate cung cấp một đối tượng Thống kê đặc biệt dành riêng cho việc này.

Ví dụ:

Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);

long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

Chúng tôi sẽ không đi vào chi tiết về điều này, bởi vì sẽ còn nhiều năm nữa trước khi bạn sử dụng hết các giải pháp bộ nhớ đệm tiêu chuẩn và cần phải cải thiện chúng theo cách thủ công. Nhân tiện, nhận xét này có thể đã được rút ra từ một trường hợp tương tự:

// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42