Persistence Spring hiệu năng cao (High-Performance Spring Persistence)

Đây là khóa học về tối ưu hóa hiệu suất JPA ở cấp độ tiếp theo, sau Fetch Join và batch_fetch_size. Vượt qua giới hạn của JPA để đến với Hibernate · JDBC · DB engine — bạn sẽ hiểu được nguyên lý hoạt động của các lớp bên dưới bề mặt và học hỏi 7 chiến lược tạo ra sự khác biệt về hiệu suất gấp 18 lần chỉ với một dòng cấu hình. Không dừng lại ở tối ưu hóa truy vấn (Read), khóa học sẽ tinh chỉnh toàn bộ Spring Persistence từ hiệu suất ghi (Write), các bẫy quan hệ (association traps) cho đến môi trường kiểm thử thực tế (production test). Được giảng dạy bởi Vlad Mihalcea, Java Champion và là người đóng góp cốt lõi cho Hibernate, dựa trên những kinh nghiệm và công cụ do chính ông tạo ra để giải quyết các giới hạn của Spring Data JPA.

(5.0) 2 đánh giá

76 học viên

Độ khó Trung cấp trở lên

Thời gian Không giới hạn

Java
Java
Spring
Spring
JPA
JPA
database
database
hibernate
hibernate
Java
Java
Spring
Spring
JPA
JPA
database
database
hibernate
hibernate

Bạn sẽ nhận được điều này sau khi học.

  • Tìm hiểu cách loại bỏ các câu lệnh SELECT không cần thiết và cải thiện hiệu suất INSERT hàng loạt lên hơn 10 lần.

  • Tìm hiểu chiến lược duy trì tốc độ truy vấn ổn định ngay cả với hàng triệu dữ liệu, bất kể số lượng trang là bao nhiêu.

  • Trực tiếp trải nghiệm sự khác biệt gấp 18 lần về hiệu suất chỉ từ một dòng thiết lập, thông qua số liệu benchmark của 4 loại DB.



Học hỏi từ Java Champion toàn cầu

Khóa học về Persistence Spring hiệu năng cao


Lớp truy cập dữ liệu hiệu suất cao phải phối hợp nhịp nhàng với cơ sở dữ liệu bên dưới.
Vượt ra ngoài JPA, đến với Hibernate · JDBC · DB — đây là hành trình tối ưu hóa toàn bộ lớp truy cập dữ liệu.


Bạn đã từng gặp trường hợp này chưa?


→ JpaRepository.saveAll()Bạn đã bao giờ phát hiện ra nó thực hiện các câu lệnh SELECT không cần thiết tương ứng với số lượng thực thể chưa?

→ @DynamicUpdate Bạn đã bao giờ gặp trường hợp khi bật nó lên mà hiệu suất lại bị giảm đi chưa?

→ Nếu bạn không biết nguyên nhân tại sao phân trang dựa trên OFFSET càng về sau càng chậm hơn gấp 20 lần?

→ Bạn có biết rằng khi truy vấn 100.000 bản ghi, chỉ với một dòng thiết lập có thể cải thiện từ 550ms → 30ms (nhanh hơn 18 lần) không?

JPA chỉ là phần nổi của tảng băng chìm
Cốt lõi nằm ở 'dưới mặt nước'


Để tầng truy cập dữ liệu có thể phối hợp nhịp nhàng với DB,
bạn cần phải biết nguyên lý hoạt động của Hibernate · JDBC · Database Engine ở bên dưới bề mặt.

Sự khác biệt này chính là ranh giới giữa một ứng dụng hiệu năng cao và một ứng dụng chỉ vừa đủ để vận hành.



Nội dung bạn sẽ học trong khóa học

7 chiến lược tối ưu hóa để nắm vững hiệu suất Spring


Từ mapping thực thể đến xử lý batch, bẫy quan hệ, lazy loading và môi trường kiểm thử
— Tìm hiểu các chiến lược cốt lõi để tối ưu hóa hiệu suất Spring Persistence.


Thiết kế mô hình dữ liệu và mã định danh cân nhắc đến hiệu suất

Nhiều nhà phát triển @Id chỉ tập trung vào việc gắn annotation, nhưng việc lựa chọn chiến lược định danh nào sẽ quyết định hiệu suất ghi. save() Bạn sẽ tìm hiểu lý do tại sao SELECT lại được thực thi ngay cả khi đó là một thực thể mới, và tại sao một số chiến lược ID nhất định lại ngăn cản việc xử lý batch.

Trước khi thay đổi

Chiến lược ID thường dùng + save()
→ Không thể INSERT hàng loạt (batch), INSERT từng bản ghi cho mỗi thực thể

Sau khi thay đổi

Thay đổi chiến lược ID và phương thức lưu trữ
→ Xử lý hàng loạt INSERT cùng lúc bằng JDBC Batch


Nguyên lý hoạt động của Persistence Context và cơ chế Flush

"Tại sao lại có nhiều truy vấn UPDATE ngoài ý muốn như vậy?" — Không còn để việc 'thời điểm SQL được thực thi' cho sự phỏng đoán nữa. Chúng ta sẽ phân tích hoạt động bên trong của Dirty Checking@DynamicUpdate học về tiêu chuẩn sử dụng thực sự của nó.

Trước khi áp dụng

@DynamicUpdateSử dụng bừa bãi
→ Ngược lại có thể gây ra các vấn đề hiệu suất khác

Sau khi áp dụng

Tiêu chuẩn phán đoán theo từng tình huốngđược thiết lập
→ Loại bỏ UPDATE không cần thiết + Duy trì bộ nhớ đệm


Xử lý lô JDBC và bộ nhớ đệm Statement

Nếu gọi lặp đi lặp lại save() trong vòng lặp for, bạn sẽ đối mặt với tình trạng hiệu suất sụt giảm khủng khiếp ngay cả khi chỉ vượt quá 10.000 bản ghi. Hãy vượt qua những giới hạn mà các hoạt động mặc định của JPA không thể giải quyết bằng cách áp dụng xử lý lô (batch processing) JDBC và Statement caching vào thực tế.

Trước khi áp dụng

saveAll() khi được gọi, sẽ thực hiện riêng lẻ
SELECT + INSERT tương ứng với số lượng thực thể

Sau khi

Thay thế phương thức lưu+ JDBC Batching
→ 0 lượt SELECT + Batch INSERT


Chiến lược Fetch để tránh N+1

Bạn nghĩ rằng đã giải quyết xong vấn đề N+1 chỉ bằng Fetch Join? Có những lĩnh vực mà Fetch Join không thể giải quyết được. Bạn sẽ được trải nghiệm hiệu suất truy vấn số lượng lớn thay đổi gấp 18 lần chỉ với một giá trị thiết lập.

Trước khi áp dụng

Truy vấn 100.000 bản ghi với Fetch Size mặc định
→ Mất 550ms

Sau khi áp dụng

Thêm một dòng thiết lập
→ mất 30ms (cải thiện 18 lần)


Phân trang và Projection để truy vấn dữ liệu lớn

"Tôi đã truy vấn toàn bộ dữ liệu và bộ nhớ đã bị quá tải." — Thừa nhận những hạn chế cơ bản của OFFSET và triển khai một giải pháp thay thế giúp duy trì tốc độ ổn định bất kể số lượng trang trong môi trường Spring Data. Chúng ta cũng sẽ cùng học kỹ thuật Projection để chỉ chọn lọc những cột thực sự cần thiết.

Trước khi áp dụng

Phân trang dựa trên OFFSET
→ Càng về sau tốc độ càng chậm đi gấp 20 lần

Sau khi

Bằng cách thay thế OFFSET
→ Tốc độ phản hồi ổn định ở bất kỳ trang nào


Bẫy hiệu năng của việc mapping quan hệ

Việc thiết lập quan hệ không khó, nhưng tùy thuộc vào cách bạn ánh xạ (mapping) mà các bảng không cần thiết có thể được tạo ra hoặc tính năng Lazy Loading bị bỏ qua. Bạn sẽ được học về những cạm bẫy hiệu suất trong quan hệ thực tế thường gặp và các mô hình giải quyết chúng.

Trước

Trong một số ánh xạ quan hệ nhất định, Lazy bị bỏ qua
→ Phát sinh bảng không cần thiết + SELECT bổ sung

Sau khi thay đổi

Chuyển đổi mô hình mapping giúp
→ Loại bỏ bảng không cần thiết + Lazy hoạt động bình thường


Kiểm thử hiệu năng dựa trên DB thực tế (Production DB)

Ngay cả khi vượt qua bài kiểm tra với H2, kết quả trên DB thực tế (production) có thể hoàn toàn khác. Bạn sẽ học được chiến lược kiểm thử để xác minh tối ưu hóa hiệu suất trong môi trường DB thực tế.

Trước khi cải thiện

Kiểm tra với DB in-memory H2
→ Phát hiện muộn các vấn đề hiệu suất trong môi trường thực tế (production)

Sau khi

Kiểm tra trên cùng một DB với môi trường thực tế
→ Xác minh trước các vấn đề hiệu suất trước khi triển khai


Nếu bạn đã thử đến cả Fetch Join, thì đây chính là nơi để bắt đầu

Hãy thêm những chi tiết tạo nên sự khác biệt cho những kỹ năng cơ bản để hoàn thiện mức độ tối ưu hóa hiệu suất.

Những tối ưu hóa mà chúng ta thường làm

  • Truy vấn N+1
    Fetch Join

  • Phân trang Collection
    default_batch_fetch_sizevới truy vấn IN

  • Truy vấn DTO
    Biểu thức khởi tạo new trong JPQL

  • INSERT số lượng lớn
    Không bao gồm

  • Overhead của save()
    không đề cập đến

  • @DynamicUpdate
    Không đề cập đến

  • Bẫy quan hệ
    Không đề cập đến

  • Kiểm tra DB thực tế
    Không đề cập đến




Spring hiệu năng cao của Vlad

  • Truy vấn N+1
    Cải thiện gấp 18 lần bằng chiến lược chuyên sâu vượt xa Fetch Join

  • Phân trang Collection
    Duy trì tốc độ ổn định bất kể số lượng trang

  • Truy vấn DTO
    Kỹ thuật truy vấn siêu nhẹ dành riêng cho Spring Data

  • INSERT hàng loạt
    Kích hoạt Batch INSERT bằng cách thay đổi thiết lập và chiến lược

  • Overhead của save()
    Loại bỏ hoàn toàn các truy vấn SELECT không cần thiết phát sinh theo số lượng entity

  • @DynamicUpdate
    Khi nào nên bật vs Khi nào nên tắt, đưa ra tiêu chí đánh giá cụ thể

  • Cạm bẫy quan hệ
    Lỗi Lazy, tạo bảng không cần thiết, v.v. Giải quyết các cạm bẫy thực tế

  • Kiểm tra DB thực tế (Production)
    Kiểm chứng trước khi triển khai trong môi trường giống hệt thực tế

Người tạo ra khóa học này

Chuyên gia được các nhà phát triển trên toàn thế giới tin tưởng
Vlad Mihalcea


  • Tác giả cuốn sách giáo khoa về hiệu suất JPA, "High-Performance Java Persistence" (Đánh giá 4.7 trên Amazon)

  • Năm 2017, được Oracle bình chọn là 'Java Champion'

  • Tham gia thiết lập tiêu chuẩn Java Persistence API (JPA) 2.1 (JSR 338 Expert Group)

  • Người đóng góp Top 0.1% trên Stack Overflow

  • Phát triển Hypersistence Optimizer

  • Cố vấn tư vấn hiệu suất JPA cho nhiều doanh nghiệp IT hàng đầu thế giới


Vlad không chỉ đơn thuần là một chuyên gia am hiểu về Hibernate.
Ông ấy chính là người đã trực tiếp tạo ra thư viện thay thế để giải quyết các giới hạn về hiệu suất của Spring Data JPA.
Trong khóa học này, bạn sẽ được học trực tiếp lý do tại sao ông ấy lại tạo ra công cụ này và nó giải quyết những vấn đề gì.


Hãy xem lời giới thiệu từ các Java Champion trên toàn thế giới!


Rafael Winterhalter
(Người sáng lập Byte Buddy
Java Champion)

Lukas Eder
(Người sáng lập JOOQ
Java Champion)

Markus Eisele
(Nhà truyền bá công nghệ tại Red Hat
Java Champion)

Cho dù bạn sử dụng trực tiếp JDBC hay thông qua JPA hoặc Hibernate, không có tài liệu nào tổng hợp các tác động đến hiệu suất tốt hơn tài liệu này.

Cuốn sách này là tài liệu bắt buộc phải đọc đối với mọi nhà phát triển muốn tối ưu hóa hiệu suất của cơ sở dữ liệu quan hệ bằng ứng dụng Java.

Vlad đã đúc kết những kinh nghiệm dày dặn của mình vào một cuốn sách rất dễ đọc, và đây là cuốn sách nhất định phải đọc nếu bạn làm việc với JPA hoặc Hibernate.



🎉 SỰ KIỆN ĐẶC BIỆT CHÀO MỪNG RA MẮT KHÓA HỌC MỚI 🎉

Nhân dịp ra mắt khóa học Spring Persistence hiệu năng cao, chúng tôi sẽ tổ chức sự kiện giảm giá cho tất cả các khóa học trong một thời gian giới hạn!

Ưu đãi 1) Giảm giá 40% cho từng bài giảng riêng lẻ
JPA & Hibernate hiệu năng cao
SQL hiệu năng cao dành cho nhà phát triển JPA (ORM)
---

Ưu đãi 2) Giảm giá 50% khi mua theo lộ trình
Lộ trình bài giảng của Java Champion thế giới, Vlad Mihalcea

Lưu ý trước khi khóa học bắt đầu

Hiện tại, phần cuối cùng là 'Tối ưu hóa Fetching' đang trong quá trình đăng tải (cập nhật).
Các chủ đề dưới đây dự kiến sẽ được lần lượt đề cập, vì vậy vui lòng tham khảo trong quá trình học tập.

<Danh sách dự kiến cập nhật>

  • Entity fetching (Truy xuất thực thể)

  • Quan hệ thực thể (FetchType.EAGER, FetchType.LAZY, LazyInitializationException, JOIN FETCH, Blaze Persistence MULTISET)

  • Xử lý luồng (Stream processing)

  • Bộ nhớ đệm kế hoạch truy vấn (Query Plan Cache)

Môi trường thực hành

  • Hệ điều hành: Có thể sử dụng Windows, macOS, Linux

  • Công cụ bắt buộc: JDK 17 trở lên, IntelliJ IDEA hoặc Eclipse IDE

  • Công cụ build: Maven, Gradle

  • Cấu hình đề nghị: RAM từ 8GB trở lên và dung lượng đĩa trống đủ dùng

Kiến thức tiên quyết và lưu ý

  • Kiến thức cơ bản về Java và Spring Framework

  • Kinh nghiệm sử dụng Spring Data JPA (JpaRepository, @Entity)

  • Kiến thức cơ bản về cơ sở dữ liệu quan hệ (RDB) và SQL

  • Sẽ hiệu quả hơn nếu bạn đã có kinh nghiệm phát triển dựa trên Spring trong thực tế.

Tài liệu học tập

  • Cung cấp tệp PDF slide bài giảng.

  • Mã thực hành sẽ được cung cấp thông qua kho lưu trữ GitHub.

  • Cuối mỗi phần đều có bài trắc nghiệm để ôn tập lại nội dung bài giảng.


🔗 Mối liên hệ với các bài giảng JPA trước đây

  • Việc đã từng học các bài giảng về hiệu năng JPA khác hay chưa không phải là điều bắt buộc.

  • Nếu bạn đã học qua, đây là bài giảng mang tính bổ trợ chứ không phải thay thế, giúp bạn hiểu sâu hơn các nội dung nâng cao.


  • Đây là khóa học chuyên sâu vượt ra ngoài các kỹ thuật tối ưu hóa cơ bản như fetch join hay batch_fetch_size.


Câu hỏi thường gặp

Q. Tôi đã biết về Fetch Join hay batch_fetch_size rồi, liệu tôi có cần khóa học này không?

Vâng, đây chính là khóa học bắt đầu từ điểm đó. Khóa học này sẽ đề cập đến bước tiếp theo là tối ưu hóa lớp Ghi (Write) và DB.

H. Khóa học này có gì khác so với khóa học 「JPA & Hibernate hiệu năng cao」 trước đây?

Khóa học trước đây sử dụng trực tiếp API EntityManager/Session và tập trung vào nguyên lý hoạt động bên trong của engine Hibernate.
Khóa học này giải quyết các vấn đề hiệu năng thực tế gặp phải trong JpaRepository@Transactional sử dụng môi trường Spring Data JPA.
Ngay cả với cùng một chủ đề là "Batching", khóa học trước sẽ đề cập đến việc "JDBC Batch hoạt động như thế nào", còn khóa học này sẽ giải quyết vấn đề "Tại sao trong Spring Data dù đã dùng saveAll() nhưng Batch vẫn không hoạt động".

Q. Tôi cần biết về JPA/Hibernate ở mức độ nào?

Chỉ cần bạn có kinh nghiệm triển khai CRUD với Spring Data JPA là đủ.
Nếu bạn đã từng sử dụng JpaRepository, @Entity, @Transactional thì có thể theo kịp tất cả nội dung. Nếu đã học khóa học trước (JPA & Hibernate hiệu năng cao) thì bạn có thể hiểu sâu hơn, nhưng đó không phải là điều kiện bắt buộc., you will be able to follow all the content. If you have taken the previous course (High-Performance JPA & Hibernate), you can gain a deeper understanding, but it is not mandatory.

Q. Sử dụng cơ sở dữ liệu nào?

Cung cấp các điểm chuẩn so sánh trên 4 cơ sở dữ liệu: MySQL, PostgreSQL, Oracle và SQL Server.
Khóa học cũng hướng dẫn cách kiểm thử trong môi trường DB thực tế thay vì chỉ sử dụng H2.

Khuyến nghị cho
những người này

Khóa học này dành cho ai?

  • Những người cần tối ưu hóa hiệu suất ở cấp độ tiếp theo sau khi đã hoàn thành khóa học về hiệu suất JPA trước đó

  • Những ai đã áp dụng Fetch Join và batch_fetch_size rồi nhưng vẫn không biết phải làm gì tiếp theo.

  • Những ai từng gặp phải tình trạng các truy vấn ngoài dự kiến phát sinh mỗi khi gọi hàm save() mà vẫn chưa tìm ra nguyên nhân.

  • Những người đã từng thử tối ưu hóa hiệu suất JPA nhưng chưa từng đi sâu xuống tầng DB (Database layer)

  • Những người làm việc thực tế cần xử lý dữ liệu lớn và phải đảm bảo cả hiệu suất ghi lẫn hiệu suất truy vấn.

Cần biết trước khi bắt đầu?

  • Kinh nghiệm sử dụng Spring Data JPA

  • Kiến thức cơ bản về Spring Framework / Spring Boot

  • Kiến thức cơ bản về cơ sở dữ liệu quan hệ (RDB) và SQL

Xin chào
Đây là Vlad Mihalcea

1,369

Học viên

77

Đánh giá

4.5

Xếp hạng

3

Các khóa học

Tên tôi là Vlad Mihalcea, và tôi là một Java Champion. Tôi đã viết cuốn sách High-Performance Java Persistence, cuốn sách đã trở thành một trong những cuốn sách về Java bán chạy nhất trên Amazon.

Hiện tại tôi đang phát triển công cụ tuyệt vời Hypersistence Optimizer, và trong thời gian rảnh, tôi phát triển nhiều dự án mã nguồn mở khác nhau (ví dụ: Hypersistence UtilsFlexyPool) cũng như trả lời các câu hỏi trên StackOverflow.

Tôi là một Java Champion và là người đóng góp chính cho dự án Hibernate ORM. Tôi đã tạo ra công cụ Hypersistence Optimizer, một công cụ quét cấu hình và ánh xạ ứng dụng để chỉ ra những thay đổi cần thiết nhằm tăng tốc lớp truy cập dữ liệu.

Đã đạt được huy hiệu vàng trên StackOverflow bằng cách trả lời hàng ngàn câu hỏi liên quan đến các thẻ Hibernate, Java và JPA.

Khi tìm thấy điều gì đó thú vị, anh ấy thích chia sẻ nó trên blog cá nhân. Anh ấy tin tưởng vào phần mềm nguồn mở và cho rằng mọi nhà phát triển nên tham gia theo một cách nào đó.

Nếu không tìm thấy công cụ phù hợp, anh ấy thậm chí còn bắt đầu các dự án nguồn mở mới như Hypersistence Utils hoặc FlexyPool.

Thêm

Chương trình giảng dạy

Tất cả

37 bài giảng ∙ (5giờ 57phút)

Tài liệu khóa học:

Tài liệu bài giảng
Ngày đăng: 
Cập nhật lần cuối: 

Đánh giá

Tất cả

2 đánh giá

5.0

2 đánh giá

  • coiio님의 프로필 이미지
    coiio

    Đánh giá 6

    Đánh giá trung bình 5.0

    5

    35% đã tham gia

    • shyoon135530님의 프로필 이미지
      shyoon135530

      Đánh giá 1

      Đánh giá trung bình 5.0

      5

      31% đã tham gia

      Khóa học tương tự

      Khám phá các khóa học khác trong cùng lĩnh vực!

      Ưu đãi có thời hạn, kết thúc sau 8 ngày ngày

      109 ₫

      49%

      5.878.222 ₫