Bộ nhớ cache cấp một và cấp hai trong Hibernate là gì?


245

Bất cứ ai cũng có thể giải thích bằng những từ đơn giản, bộ nhớ đệm cấp một và cấp hai trong Hibernate là gì?

Câu trả lời:


300

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/


38
+1 để ánh xạ Cache cấp một với đối tượng phiên và Cache cấp hai với đối tượng Factory Factory. tôi thậm chí không cần tiếp tục đọc.
Mahes

1
Bộ nhớ cache cấp 1. trong hầu hết các trường hợp không cần thiết, nhưng không có lựa chọn nào để loại bỏ nó. nhưng bạn nên nghĩ về nó mọi lúc ..
Ses

6
@ vòi Bạn sẽ cần bộ đệm cấp 1 trong hầu hết các trường hợp. Nếu không, bạn sẽ gặp vấn đề HIỆU SUẤT rất BAD như truy vấn N + 1 hoặc không có bộ đệm tìm nạp trước háo hức hoặc truy vấn một lần mỗi khi bạn truy cập một thuộc tính.
Dennis C

Thông thường chúng tôi sử dụng phiên trong khoảng thời gian rất ngắn [và cơ thể khuyến nghị nó] / phiên tồn tại ngắn: chúng tôi thậm chí không sử dụng bộ đệm đó trong khoảng thời gian đó. nếu phiên tồn tại lâu thì chúng tôi sẽ hủy dữ liệu (ví dụ khi chỉnh sửa biểu mẫu) khỏi phiên. Có vẻ như chỉ cần một kịch bản khi chúng tôi cố gắng sử dụng truy vấn phiên-api trong khi xây dựng một số yêu cầu phức tạp sau yêu cầu cho phiên tồn tại lâu.

1
@DennisCheung: Liên kết đã chết. Cập nhật vui lòng với javabeat.net/introduction-to-hibernate-caching
newuser

118

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.


20
Đó là những từ đơn giản ngay tại đó, tôi không biết tại sao họ lại gặp khó khăn như vậy để giải thích nó
BlackTigerX

hehe ... vâng tôi thực sự không biết làm thế nào tôi có thể trở nên đơn giản hơn nhiều :)
lomaxx

2
điều này thực sự rõ ràng hơn đối với tôi. đầu tiên là mỗi phiên trong đó phiên thứ hai dành cho nhiều phiên, đơn giản để tôi ghi nhớ. Chúng ta có thể bỏ phiếu hai lần không? : D
black sensei

1
không có mẫu tại sao cần bộ đệm cấp 1. như đối với tôi trong hầu hết các trường hợp nó không cần thiết chút nào. nhưng bạn nên nghĩ về nó và về phiên mọi lúc.
Ses

Đã 11 năm kể từ câu trả lời này và thật không may liên kết không tồn tại. Nhưng tôi đã tìm thấy nội dung của nó trên trang web lưu trữ của nó: web.archive.org/web/20081207044228/http:// móc
Golu

105

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.


2
Giải thích tuyệt vời! Nếu bạn có thể vẽ một số sơ đồ trình tự thì nó sẽ rất tuyệt !!!
Adelin

giải thích
cặn kẽ

1
Nếu bạn đang muốn xem lại những gì bạn đã biết, thì hai câu trả lời trên của Dennis C và Iomaxx rất hay, rất cô đọng và dễ nhớ. Tuy nhiên, nếu bạn đang tìm kiếm một lời giải thích về sự khác biệt khi bạn chưa biết về nó, câu trả lời này tốt hơn nhiều!
Linh hồn sinh viên

Giải thích tuyệt vời !!
blu3

17

Đâ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.

Bộ nhớ cache cấp đầu tiên

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.

nhập mô tả hình ảnh ở đây

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:

Bộ nhớ cache cấp hai

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 .


3

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.


1

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.


-4

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.