Câu trả lời:
1.1) Bộ đệm cấp một
Bộ đệm cấp một luôn kết hợp với đối tượng Phiên . Hibernate sử dụng bộ đệm này theo mặc định. Ở đây, nó xử lý một giao dịch sau một giao dịch khác, có nghĩa là sẽ không xử lý một giao dịch nhiều lần. Chủ yếu là nó làm giảm số lượng truy vấn SQL cần thiết để tạo trong một giao dịch nhất định. Đó là thay vì cập nhật sau mỗi lần sửa đổi được thực hiện trong giao dịch, nó chỉ cập nhật giao dịch vào cuối giao dịch.
1.2) Bộ nhớ cache cấp hai
Bộ đệm cấp hai luôn liên kết với đối tượng Session Factory . Trong khi chạy các giao dịch, ở giữa nó tải các đối tượng ở cấp Phiên bản, để các đối tượng đó sẽ có sẵn cho toàn bộ ứng dụng, không bị ràng buộc với một người dùng. Vì các đối tượng đã được tải trong bộ đệm, nên bất cứ khi nào một đối tượng được truy vấn trả về, tại thời điểm đó không cần phải thực hiện giao dịch cơ sở dữ liệu. Theo cách này, bộ đệm cấp hai hoạt động. Ở đây chúng ta cũng có thể sử dụng bộ đệm cấp truy vấn.
Trích dẫn từ: http://javabeat.net/int sinhtion-to-hibernate-caching/
Có một lời giải thích khá hay về bộ nhớ đệm cấp đầu tiên trên blog Streamline Logic .
Về cơ bản, bộ nhớ đệm cấp thứ nhất xảy ra trên cơ sở mỗi phiên trong đó bộ đệm cấp hai có thể được chia sẻ qua nhiều phiên.
Dưới đây là một số giải thích cơ bản về bộ nhớ cache ngủ đông ...
Bộ nhớ cache cấp đầu tiên được liên kết với đối tượng phiên phiên bản. Phạm vi của các đối tượng bộ đệm là phiên. Khi phiên được đóng lại, các đối tượng lưu trữ sẽ biến mất vĩnh viễn. Bộ nhớ cache cấp đầu tiên được bật theo mặc định và bạn không thể tắt nó. Khi chúng tôi truy vấn một thực thể lần đầu tiên, nó được truy xuất từ cơ sở dữ liệu và được lưu trữ trong bộ đệm cấp độ đầu tiên được liên kết với phiên ngủ đông. Nếu chúng ta truy vấn cùng một đối tượng một lần nữa với cùng một đối tượng phiên, nó sẽ được tải từ bộ đệm và không có truy vấn sql nào được thực thi. Các thực thể được tải có thể được loại bỏ khỏi phiên bằng evict()
phương pháp. Lần tải tiếp theo của thực thể này sẽ lại thực hiện cuộc gọi cơ sở dữ liệu nếu nó đã bị xóa bằng evict()
phương thức. Bộ đệm toàn bộ phiên có thể được loại bỏ bằng clear()
phương pháp. Nó sẽ loại bỏ tất cả các thực thể được lưu trữ trong bộ nhớ cache.
Bộ đệm cấp hai khác với bộ đệm cấp thứ nhất có sẵn để được sử dụng trên toàn cầu trong phạm vi nhà máy phiên. bộ đệm cấp hai được tạo trong phạm vi nhà máy phiên và có sẵn để được sử dụng trong tất cả các phiên được tạo bằng nhà máy phiên cụ thể đó. Điều đó cũng có nghĩa là một khi nhà máy phiên bị đóng, tất cả bộ đệm được liên kết với nó sẽ chết và trình quản lý bộ đệm cũng đóng lại. Bất cứ khi nào phiên ngủ đông cố gắng tải một thực thể, nơi đầu tiên nó tìm bản sao được lưu trong bộ nhớ cache của thực thể trong bộ đệm cấp đầu tiên (được liên kết với phiên ngủ đông cụ thể). Nếu bản sao lưu thực thể được lưu trong bộ đệm cấp đầu tiên, nó được trả về như là kết quả của phương thức tải. Nếu không có thực thể được lưu trong bộ nhớ cache cấp đầu tiên, thì bộ đệm cấp hai sẽ được tìm kiếm cho thực thể được lưu trong bộ nhớ cache. Nếu bộ đệm cấp hai có thực thể được lưu trong bộ nhớ cache, nó được trả về do kết quả của phương thức tải. Nhưng, trước khi trả lại thực thể, nó cũng được lưu trong bộ đệm cấp một để lệnh gọi phương thức tải tiếp theo cho thực thể sẽ trả về thực thể từ chính bộ đệm cấp thứ nhất và không cần phải chuyển sang bộ đệm cấp hai nữa. Nếu không tìm thấy thực thể trong bộ đệm cấp một và bộ đệm cấp hai, thì truy vấn cơ sở dữ liệu được thực thi và thực thể được lưu trữ ở cả hai cấp độ bộ đệm, trước khi trả về dưới dạng phản hồi củaload()
phương pháp.
Đây là một câu hỏi rất phổ biến, vì vậy câu trả lời này dựa trên bài viết này tôi đã viết trên blog của mình.
Hibernate cố gắng trì hoãn Bối cảnh dai dẳng tuôn ra cho đến giây phút cuối cùng có thể. Như tôi đã giải thích trong bài viết này , chiến lược này đã được biết đến theo truyền thống là viết phía sau giao dịch.
Việc viết phía sau có liên quan nhiều hơn đến việc xóa Hibernate hơn là bất kỳ giao dịch logic hoặc vật lý nào. Trong một giao dịch, việc xả có thể xảy ra nhiều lần.
Các thay đổi tuôn ra chỉ hiển thị cho giao dịch cơ sở dữ liệu hiện tại. Cho đến khi giao dịch hiện tại được cam kết, không có thay đổi nào được nhìn thấy bởi các giao dịch đồng thời khác.
Do bộ đệm cấp một, Hibernate có thể thực hiện một số tối ưu hóa:
Một giải pháp bộ đệm phù hợp sẽ phải trải rộng trên nhiều Phiên Hibernate và đó là lý do Hibernate hỗ trợ thêm bộ đệm cấp hai.
Bộ đệm cấp hai được liên kết với vòng đời của SessionFactory, do đó, nó chỉ bị hủy khi SessionFactory
đóng (thường là khi ứng dụng đang tắt). Bộ đệm cấp hai chủ yếu được định hướng dựa trên thực thể, mặc dù nó cũng hỗ trợ một giải pháp bộ đệm truy vấn tùy chọn.
Để biết thêm chi tiết, hãy xem bài viết này .
theo mặc định, NHibernate sử dụng bộ đệm ẩn cấp đầu tiên dựa trên Đối tượng Phiên. nhưng nếu bạn đang chạy trong môi trường nhiều máy chủ, thì bộ đệm cấp đầu tiên có thể không có khả năng mở rộng cùng với một số vấn đề về hiệu suất. điều này xảy ra vì thực tế là nó phải thực hiện các chuyến đi rất thường xuyên đến cơ sở dữ liệu vì dữ liệu được phân phối trên nhiều máy chủ. nói cách khác, NHibernate cung cấp bộ đệm L1 trong quá trình cơ bản, không quá phức tạp. Tuy nhiên, nó không cung cấp các tính năng mà một giải pháp bộ đệm phải có tác động đáng chú ý đến hiệu năng của ứng dụng.
Vì vậy, câu hỏi của tất cả các vấn đề này là việc sử dụng bộ đệm L2 được liên kết với các đối tượng nhà máy phiên. nó làm giảm các chuyến đi tốn thời gian đến cơ sở dữ liệu để cuối cùng tăng thời gian phản hồi của ứng dụng.
Cache cấp một
Đối tượng phiên giữ dữ liệu bộ đệm cấp đầu tiên. Nó được kích hoạt theo mặc định. Dữ liệu bộ nhớ cache cấp đầu tiên sẽ không có sẵn cho toàn bộ ứng dụng. Một ứng dụng có thể sử dụng nhiều đối tượng phiên.
Cache cấp hai
Đối tượng SessionFactory giữ dữ liệu bộ đệm cấp hai. Dữ liệu được lưu trữ trong bộ đệm cấp hai sẽ có sẵn cho toàn bộ ứng dụng. Nhưng chúng ta cần kích hoạt nó một cách rõ ràng.
Trong bộ đệm cấp hai, các tệp hbm miền có thể là khóa có thể thay đổi và giá trị sai. Ví dụ, trong lớp miền này, một số thời lượng trong một ngày không đổi là sự thật phổ quát. Vì vậy, nó có thể được đánh dấu là bất biến trên toàn ứng dụng.