Chiến lược đồng thời

Sau khi bạn kích hoạt bộ nhớ đệm cấp hai trong Hibernate, bạn cần giải thích cho Hibernate những đối tượng Thực thể nào chúng ta muốn lưu vào bộ nhớ đệm và cách thực hiện.

Để làm điều này, Hibernate có một chú thích đặc biệt cho các lớp Thực thể - @Cache . Ví dụ:

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

Chú thích này cần được viết cho từng thực thể Thực thể mà chúng tôi muốn sử dụng bộ nhớ đệm cấp hai. Ví dụ:

@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
    @Id
    private Integer id;
    private Set<Task> tasks;
}

Hibernate có 4 chiến lược truy cập khả thi cho một thực thể được lưu trong bộ nhớ cache nếu nó được truy cập từ các luồng khác nhau:

  • chỉ đọc
  • đọc viết
  • không giới hạn-đọc-ghi
  • giao dịch

Chỉ đọc . Một chiến lược đồng thời phù hợp với dữ liệu không bao giờ thay đổi. Hibernate sẽ chỉ lưu trữ các đối tượng này trong bộ nhớ của nó. Chỉ sử dụng nó cho dữ liệu tham khảo.

Cơ sở dữ liệu lưu trữ rất nhiều thông tin không bao giờ thay đổi. Ví dụ: một bảng giữ danh sách các sự kiện chỉ được thêm vào chứ không bao giờ bị thay đổi hoặc xóa. Nếu bạn cần làm việc với bảng này thông qua Hibernate, thì chiến lược bộ nhớ đệm chỉ đọc sẽ phù hợp với bạn.

Đọc-ghi (read-write). Sử dụng chiến lược này cho dữ liệu chủ yếu có thể đọc được. Tuy nhiên, Hibernate sẽ theo dõi các nỗ lực thay đổi dữ liệu này, mặc dù Hibernate cho rằng chúng sẽ rất hiếm khi xảy ra.

Bạn cần lưu trữ chủ yếu những đối tượng hiếm khi thay đổi và thường được đọc/yêu cầu. Nếu bạn có những đối tượng như vậy, thì bạn cần sử dụng chiến lược đọc-ghi cho chúng.

Không hạn chế đọc-ghi . Chiến lược này không đảm bảo tính nhất quán giữa bộ đệm và cơ sở dữ liệu. Sử dụng chiến lược này nếu dữ liệu gần như không bao giờ thay đổi và khả năng dữ liệu cũ không phải là vấn đề nghiêm trọng.

Không giống như chiến lược đọc-ghi, chiến lược này giả định rằng dữ liệu có thể thay đổi không bị khóa để đọc. Điều này có thể dẫn đến việc đối tượng bị thay đổi ở một nơi, trong khi ở một nơi khác, ai đó đang đọc phiên bản cũ của nó.

Ví dụ: một người dùng đã thay đổi nhận xét của mình, nhưng những người dùng khác vẫn thấy phiên bản cũ của anh ta trong một thời gian. Nếu đây không phải là vấn đề đối với bạn, thì hãy sử dụng chiến lược đọc-ghi không giới hạn.

Giao dịch . Sử dụng chiến lược này cho dữ liệu chủ yếu chỉ đọc khi điều quan trọng là ngăn chặn dữ liệu cũ trong các giao dịch đồng thời trong trường hợp cập nhật hiếm hoi.

Lưu trữ dữ liệu trong bộ đệm

Một chi tiết quan trọng khác về bộ nhớ cache cấp hai mà bạn nên nhớ là Hibernate không tự lưu trữ các đối tượng trong lớp của bạn. Nó lưu trữ thông tin dưới dạng mảng chuỗi, số, v.v.

Và định danh đối tượng hoạt động như một con trỏ tới thông tin này. Về mặt khái niệm, đây giống như một Bản đồ, trong đó id của đối tượng là khóa và các mảng dữ liệu là giá trị. Bạn có thể tưởng tượng nó như thế này:

1 -> { "Ivanov", 1, null , {1,2,5} }
2 -> { "Petrov", 2, null , {1,2,5} }
3 -> { "Sidorov", 3, null , {1,2,5} }

Điều này rất hợp lý khi xem xét mỗi đối tượng chiếm bao nhiêu bộ nhớ bổ sung.

Ngoài những điều trên, bạn nên nhớ rằng các phần phụ thuộc của lớp Thực thể của bạn cũng không được lưu vào bộ nhớ cache theo mặc định. Ví dụ: nếu chúng ta xem xét lớp ở trên, Nhân viên , thì khi tìm nạp, bộ sưu tập tác vụ sẽ được lấy từ cơ sở dữ liệu chứ không phải từ bộ đệm cấp hai .

Nếu bạn cũng muốn lưu trữ các phụ thuộc vào bộ đệm, thì lớp sẽ trông như thế này:

@Entity
@Table(name = "employee")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
    @Id
    private Integer id;

   @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
   private Set<Task> tasks;
}

Và chi tiết cuối cùng - việc đọc từ bộ đệm cấp hai chỉ xảy ra nếu không tìm thấy đối tượng mong muốn trong bộ đệm cấp một.

Chế độ bộ đệm

Hibernate cho phép quản lý bộ nhớ đệm rất linh hoạt. Bạn có thể đặt chế độ bộ đệm cho từng phiên riêng lẻ hoặc thậm chí cho từng yêu cầu cơ sở dữ liệu.

Có năm chế độ như vậy:

  • LẤY
  • PHỚT LỜ
  • BÌNH THƯỜNG
  • ĐẶT
  • LÀM CHO KHỎE LẠI

Bảng dưới đây mô tả công việc của họ:

Chế độ bộ đệm Sự miêu tả
LẤY Dữ liệu được đọc từ bộ đệm nhưng không được thêm vào nó.
PHỚT LỜ Phiên không tương tác với bộ đệm.
BÌNH THƯỜNG Dữ liệu được đọc từ bộ đệm và thêm vào nó.
ĐẶT Dữ liệu không bao giờ được lấy từ bộ đệm mà được thêm vào nó.
LÀM CHO KHỎE LẠI Dữ liệu không bao giờ được lấy từ bộ đệm mà được thêm vào nó. Trong chế độ này, cài đặt hibernate.cache.use_minimal_puts được sử dụng thêm.

Một ví dụ về cài đặt chế độ bộ đệm cho một phiên:

session.setCacheMode(CacheMode.GET);
Employee director = session.createQuery("from Employee where id = 4").uniqueResult();

Và cũng là một ví dụ về cài đặt chế độ cho phiên và yêu cầu:

session.setCacheMode(CacheMode.GET);
Query query = session.createQuery("from Employee where id = 4");
query.setCacheMode(CacheMode.IGNORE); // Ignore cache work for this request
Employee director = query.uniqueResult();