12/08/2018, 16:11

Hibernate Caching - Bài 1: First Level Cache

Chào mừng các bạn đến với chuỗi bài hướng dẫn của mình về Hibernate Caching. Hibernate Cache rất hữu ích trong việc tăng hiệu suất của ứng dụng nếu được sử dụng đúng cách. Ý tưởng của nó là giảm số lượng truy vấn tới cơ sở dữ liệu, dẫn tới giảm tải thời gian thông lượng của ứng dụng. ...

Chào mừng các bạn đến với chuỗi bài hướng dẫn của mình về Hibernate Caching.

Hibernate Cache rất hữu ích trong việc tăng hiệu suất của ứng dụng nếu được sử dụng đúng cách. Ý tưởng của nó là giảm số lượng truy vấn tới cơ sở dữ liệu, dẫn tới giảm tải thời gian thông lượng của ứng dụng.

Hibernate Framework mang tới cho chúng ta 3 kiểu cache khác nhau. Bao gồm

  1. First Level Cache: Hibernate First Level Cache được kết hợp với đối tợi Session (phiên làm việc). FLC được mặc định sử dụng trong Hibernate ta không có cách nào để tắt nó đi. Tuy nhiên, Hibernate cung cấp các phuơng thức mà thông qua nó, chúng ta có thể xóa bỏ các đối tượng được lựa chọn từ bộ nhớ cache hay giải phóng bộ nhớ cache 1 cách hoàn toàn. Bất cứ đối tượng đuợc cách nào trong 1 session (phiên làm việc) sẽ không bị ảnh hưởng bởi các session khác và khi session đó bị đóng lại, tất cả các đối tượng được cache đó cũng sẽ bị mất.

  2. Second Level Cache: Chúng ta sẽ tìm hiểu trong bài số 2 của series này nhé

  3. Query Cache: Chúng ta sẽ tìm hiểu trong bài số 3 của series này nhé

Hibernate First Level Cache được kết hợp với đối tượng Session (phiên làm việc). First Level Cache được mặc định sử dụng trong Hibernate và bạn chẳng cần phải làm gì để bật nó lên cũng như không có cách nào để tắt nó đi cả. Tuy nhiên, Hibernate cung cấp các phuơng thức mà thông qua nó, chúng ta có thể xóa bỏ các đối tượng được lựa chọn từ bộ nhớ cache hay giải phóng bộ nhớ cache 1 cách hoàn toàn. Bất cứ đối tượng đuợc cách nào trong 1 session (phiên làm việc) sẽ không bị ảnh hưởng bởi các session khác và khi session đó bị đóng lại, tất cả các đối tượng được cache đó cũng sẽ bị mất.

CÁC ĐẶC ĐIỂM QUAN TRỌNG CẦN CHÚ Ý

  1. First Level Cache được kết hợp với đối tượng "session" và các đối tượng session khác trong ứng dụng không thể "nhìn thấy" hay làm ảnh hưởng
  2. Phạm vi của cách đối tượng cache này là session (phiên). Khi một session bị đóng lại, các đối tượng cache thuộc session đó sẽ vĩnh viễn bị mất đi.
  3. First Level Cache là mặc định trong Hibernate và không có cách nào để disable nó cả.
  4. Khi chúng ta truy vấn 1 thực thể (abc) lần đầu tiên, nó sẽ được lấy về từ database và được lữu trữ trong bộ nhớ của first-level cache - cái mà được liên kết với đối tượng hibernate session
  5. Nếu chúng ta truy vấn lại cùng 1 đối tượng (abc) với cùng session, nó sẽ được load từ trong cache thay vì việc thực thi lại câu truy vấn sql
  6. Thực thể (abc) được load có thể bị xóa khỏi session, khỏi bộ nhớ first level cache bằng việc sử dụng phuơng thức evict(entity). Như vậy, vào lần tiếp theo ta truy vấn thực thể đó, nó sẽ được lấy từ database (thay vì bộ nhớ cache).
  7. Toàn bộ bộ nhớ cache cúa session có thể bị làm trống với việc sử dụng phuơng thức clear(). Điều này có nghĩa là các thực thể được lưu trữ trong bộ nhớ cache cũng sẽ bị xóa bỏ.

Để dễ hiểu hơn, bạn hãy tưởng tượng câu chuyện duới đây

Hôm nay là bạn có cỗ mà nhà bạn thì lại thiếu quá nhiều thứ cho việc nấu nướng.........

Sáng sớm, bạn chạy sang nhà hàng xóm mượn 1 con dao với 1 cái thớt. 
Đầu tiên, bạn lấy con dao để bổ củi, dùng xong bạn để ở dưới bếp nhà mình để trưa thái thịt bằng dao và thớt.
Sáng tới trưa, bạn cần dao và thớt để thái thịt, bạn chỉ việc chạy xuống bếp,, thay vì phải sang nhà hàng xóm mượn lại. Tiện quá đúng ko?
Giờ không cần tới thớt nữa, bạn cũng lại nhớ ra là mình cần cái mâm, thế rồi bạn cầm cái thớt sang trả và mượn cái mâm về.

Đệch, nhưng mà gà luộc còn chưa chặt, giờ méo có thớt thì chặt kiêủ gì nhỉ? 
Thế là bạn lại lóc cóc sang nhà hàng xóm mượn lại cái thớt. 
Bạn chợt nghĩ. "Đê ma ma! Vừa mà ko trả ngay thì chỉ cần phải xuống dưới bếp là có thớt rồi không"!

Sang giờ chiều, bạn mang tất cả chúng sang trả lại nhà hàng xóm.

Lần sau có cỗ, lại mượn tiếp mấy cái đó :)

Trong ví dụ trên

  • Nhà hàng xóm của bạn đóng vai trò là Database
  • Nhà bếp nhà bạn đóng vai trò là bộ nhớ cache của First Level Cache
  • Con dao là đối tượng thực thể ta sử dụng entity
  • Khi bạn trả các thớt, bạn đã sử dụng evict(cái thớt) loại bỏ cái thớt khỏi cái bếp (bộ nhớ cache)
  • Tới chiều, bạn trả toàn bộ các đồ bạn đã mượn, bạn vừa sử dụng hàm clear() và đóng cái session đó lại.
  • Hôm sau nếu có cỗ, bạn lại đi mượn, lúc đó, session mới lại được mở và bắt đầu             </div>
            
            <div class=
0