Hibernate caching

Bài viết này sẽ cung cấp các knowledge cần thiết để giúp người đọc có thể hiểu thêm về một aspect của ORM framework - hibernate caching. Caching là tất cả những gì về việc tối ưu hóa hệ thống, cụ thể nó sẽ tối ưu việc giao tiếp ứng dụng với database để tránh việc truy cập đến DB nhiều, giúp cải thiện performance cho các ứng dụng quan trọng. Caching là một khái niệm quan trọng trong Hibernate và các level caching được mô tả như hình dưới đây: hibernate_cache.jpg

1.First-lovel cache:

First-level cach là Session cache và nó là một phần bắt buộc, phần mà tất cả các request đều phải truyển qua. Session object này giữ một object trong session trước khi commit no lên DB. Nếu có nhiều event update được gọi cho 1 object, Hibernate sẽ tạo ra một khoảng trế đủ dài cho quả trình thực hiện để cis thể giảm số lượng câu SQL update được đưa ra. Nếu Session này bị closed, tất cả objects trong session sẽ bị mất và nó sẽ được persist hoặc udpate vào DB.

2.Second-level cache: Second level cach là một cache tùy chọn và first-level cache sẽ luôn luôn được thực hiện trước khi thử đặt một object vào second-level cache. Second-level cache này có thể được configure trên mỗi class và mỗi collection và chịu trách nhiệm chính cho việc caching các objects qua session. Việc setup second-level cache sẽ được thực hiện trong 2 bước. Đầu tiên là việc define concurrency strategy nào được sử dụng. Tiếp theo, đó là việc configure các attribute cho cache expiration và cache vật lý thứ mà sử dụng cache provider. Một thành phần quan trọng của second-level cache là concurrency strategies. Một concurrency strategy là một thành phần phụ trách việc lưu trữ các item của dữ liệu vào cache và đọc lại nó từ cache. Nếu second-level cache đang được enable, bắt buộc phải define concurrency strategy nào được sử dụng. Cóc các loại concurrency strategy sau:

  • Transactional: Sử dụng strategy này hầu hết cho việc đọc dữ liệu để tránh việc mất dữ liệu trong các transactions xảy ra đồng thời. Strategy này ít khi đuợc sử dụng cho update.

  • Read-write: Strategy khá giống transactional strategy, nó cũng được sử dụng hâù hết cho việc đọc data.

  • Nonstrict-read-write: Strategy này không đảm bảo đồng nhất giữa cache và database. Sử dụng strategy này nếu data it khi bị thay đổi và nó không còn đuợc sử dụng. -Read-only: Strategy này thích hợp cho dữ liệu thứ mà không bao giờ bị thay đổi, chỉ sử dụng cho việc reference sữ liệu. Ví dụ: Giả sử có một entity Employee và nếu sử dụng second-level cache cho class này sẽ phải thực hiện configure như dưới đây:

        <?xml version="1.0" encoding="utf-8"?>
     <!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD//EN"
      "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
     <hibernate-mapping>
        <class name="Employee" table="EMPLOYEE">
              <meta attribute="class-description">
                    This class contains the employee detail.
           </meta>
           <cache usage="read-write"/>
           <id name="id" type="int" column="id">
              <generator class="native"/>
           </id>
           <property name="firstName" column="first_name" type="string"/>
           <property name="lastName" column="last_name" type="string"/>
           <property name="salary" column="salary" type="int"/>
        </class>
     </hibernate-mapping>
    

Attribute usage="read-write" được hibernate mark và sử dụng concurrency strategy là read-write cho second-cache.

.3. Query-level cache: Hibernate cũng cung cấp 1 cache cho query resultsets thứ mà được tích hợp khá giống với second-level cache. Đây cũng là một tính năng optional và nó yêu cầu thêm 2 vùng cach vật lý nơi mà sẽ nắm giữ kết quả của câu lệnh query và timestamps khi mà một table được udpate lần cuối cùng. Query-cache chỉ hữu ích cho các câu query thứ mà được chạy thường xuyên với cùng parameters. Để sử dụng query cache, cần sử dụng property sau:

         hibernate.cache.use_query_cache="true"

Tiếp theo, cần gọi method setCacheable(Boolean) của Query class. Ví dụ:

        Session session = SessionFactory.openSession();
        Query query = session.createQuery("FROM EMPLOYEE");
        query.setCacheable(true);
        List users = query.list();
        SessionFactory.closeSession();

Thêm vào đó, Hibernate cũng hỗ trợ tốt cho việc cache region. Việc apply cach region sẽ được apply theo tên class.

    Session session = SessionFactory.openSession();
    Query query = session.createQuery("FROM EMPLOYEE");
    query.setCacheable(true);
    query.setCacheRegion("employee");
    List users = query.list();
    SessionFactory.closeSession();

Việc lưu trữ và tìm kiếm bằng các câu query với employee sẽ lưu trữ trong cache.

Sau bài viết này, người đọc sẽ có nhận thức một cách tốt hơn về các level cache khi sử dụng Hibernate.