高性能 JPA & Hibernate (High-Performance Java Persistence)
Vlad Mihalcea
あなたのJava永続化アプリケーションは、うまく作られた高性能なエンタープライズアプリケーションですか?それともかろうじて動くだけの遅いコードですか? この両者は本当に紙一重です。 JPA、Hibernateについてしっかり勉強して、高性能なアプリケーションを構築しましょう!
中級以上
Java, JPA, hibernate
フェッチジョインと batch_fetch_size の次、その先のステップの JPA パフォーマンス最適化を扱う講義です。 JPA を超えて Hibernate ・ JDBC ・ DB エンジンまで — 水面下のレイヤーの動作原理を理解し、設定一行で 18 倍のパフォーマンス差を生む 7 つの戦略を学習します。 照会(Read)の最適化にとどまらず、書き込み(Write)パフォーマンスや関連関係の罠、プロダクションテスト環境まで Spring Persistence 全体をチューニングします。 Java Champion であり Hibernate の核心的なコントリビューターである Vlad Mihalcea が、Spring Data JPA の限界を解決するために自ら作成したツールと経験をもとに教えます。
不要なSELECTを削除し、大量INSERTのパフォーマンスを10倍以上改善する方法を学びます。
数百万件のデータでも、ページ数に関係なく一定の照会速度を維持する戦略を学びます。
設定一行の差が生む18倍の性能格差を、4つのDBベンチマーク数値で直接体感します。
高性能なデータアクセス層は、その下のデータベースと呼吸が合っていなければなりません。
JPAを超えて Hibernate・JDBC・DBまで — データアクセス層全体を最適化する旅です。
→ JpaRepository.saveAll()がエンティティの数だけ不要なSELECTを飛ばしているのを発見したことはありますか?
→ @DynamicUpdateを有効にしたら、むしろパフォーマンスが低下した経験はありませんか?
→ OFFSETベースのページネーションが後ろに行くほど20倍遅くなる原因がわからないなら?
→ 10万件の照会時、設定一行の差で550ms → 30ms(18倍改善)が可能であることをご存知ですか?
データアクセス層がDBと足並みを揃えるには、
水面下にあるHibernate・JDBC・データベースエンジンの動作原理を知る必要があります。
講義で学ぶ内容
エンティティマッピングからバッチ処理、関連性の罠、遅延読み込み、テスト環境まで
— Spring Persistence性能チューニングの核心戦略を学習します。
多くの開発者が@Idアノテーションを付けることだけに集中していますが、どの識別子戦略を選択するかが書き込みパフォーマンスを決定します。save()が新しいエンティティであるにもかかわらずSELECTを実行する理由、特定のID戦略がバッチ処理を妨げる理由を学習します。
Before
よく使われるID戦略 + save()
→ バッチINSERT不可、エンティティごとに1件ずつINSERT
After
ID戦略と保存方式の変更で
→ JDBCバッチで大量INSERTを一括処理
"意図しないUPDATEクエリがなぜこんなに多いのか?" — 'SQLが実行されるタイミング'を、もはや推測に任せることはありません。Dirty Checking(ダーティチェック)の内部動作を分析し、@DynamicUpdateの真の使用基準を学びます。
Before
@DynamicUpdateの無闇な使用
→ かえって別の性能問題を誘発
After
状況別の判断基準確立
→ 不必要なUPDATEの除去 + キャッシュの維持
for文の中でsave()を繰り返し呼び出すと、1万件を超えただけでも深刻なパフォーマンス低下に直面します。JPAの基本動作だけでは解決できない限界を超え、JDBCバッチ処理とStatementキャッシングを実戦に適用します。
Before
saveAll()呼び出し時にエンティティの数だけ
SELECT + INSERT 個別実行
After
保存メソッドの入れ替え+ JDBC Batching
→ SELECT 0件 + バッチ INSERT
N+1問題の解決をフェッチジョインだけで終わらせたと思っていませんか?フェッチジョインでは解決できない領域があります。設定値一つで大量照会のパフォーマンスが18倍も変わる経験をすることになります。
Before
デフォルトのFetch Sizeで10万件を取得
→ 550ms 所要
After
設定を一行追加
→ 30ms 所要 (18倍改善)
「全データを照会したらメモリがパンクしてしまいました」 — OFFSETの根本的な限界を認め、ページ数に関係なく一定の速度を維持する代替案をSpring Data環境で実装します。必要なカラムだけを選んで取得するプロジェクション技法も併せて学びます。
Before
OFFSETベースのページネーション
→ 後ろに行くほど20倍遅くなる
After
OFFSETを代替する方法で
→ どのページでも一定のレスポンス速度
関連関係を設定することは難しくありませんが、どのような方法でマッピングするかによって、不要なテーブルが生成されたり、Lazy Loadingが無視されたりします。実務で頻繁に遭遇する関連関係のパフォーマンスの落とし穴と、その解決パターンを学習します。
Before
特定の関連付けマッピングでLazyが無視され
→ 不必要なテーブル + 追加のSELECTが発生
After
マッピングパターンの転換で
→ 不必要なテーブルの除去 + Lazyの正常動作
H2でテストをパスしても、本番DBでは全く異なる結果が出る可能性があります。実際のDB環境でパフォーマンス最適化を検証するテスト戦略を学びます。
Before
H2インメモリDBでテスト
→ プロダクションで性能問題が後から発覚
After
本番環境と同じDBでテスト
→ デプロイ前にパフォーマンス問題を事前検証
基本に一歩差をつけるディテールを加え、パフォーマンス最適化の完成度を高めましょう。
私たちが普段行う最適化
N+1クエリ
フェッチジョイン
コレクションのフェージングdefault_batch_fetch_sizeによるINクエリ
DTO 照会
JPQL new コンストラクタ式
大量INSERT
扱わない
save()のオーバーヘッド
扱わない
@DynamicUpdate
扱わない
関連関係の罠
扱わない
本番DBテスト
扱わない
Vladの高性能Spring
N+1クエリ
フェッチジョインを超えた深化戦略で18倍改善 with advanced strategies beyond Fetch Join
コレクションのページング
ページ数に関係なく一定の速度を維持
DTOプロジェクション
Spring Data専用の軽量クエリ手法 dành riêng cho Spring Data
大量のINSERT
設定と戦略の変更でバッチINSERTを有効化 by changing settings and strategies bằng cách thay đổi thiết lập và chiến lược
save()のオーバーヘッド
エンティティの数だけ発生する不要なSELECTを完全に除去
@DynamicUpdate
使うべき時 vs 使うべきではない時、判断基準を提示
関連関係の罠
Lazy失敗、不必要なテーブル生成など実戦の罠を解決
本番DBテスト
本番と同一の環境でデプロイ前の事前検証
この講義を作った人
JPA性能の教科書、「High-Performance Java Persistence」著者(Amazon評価 4.7)
2017年、Oracle選定 'Java Champion'
Java Persistence API(JPA) 2.1 標準策定に参加 (JSR 338 Expert Group)
Stack Overflow トップ0.1% 貢献者
Hypersistence Optimizer 開発
グローバル・トップティアIT企業の多数を対象としたJPA性能コンサルタント
Vladは単にHibernateを熟知している専門家ではありません。
Spring Data JPAの性能の限界を解決するために、自ら代替ライブラリを作った人物です。
この講義では、彼がなぜこのツールを作ったのか、どのような問題を解決するのかを直接学びます。
Rafael Winterhalter
(Byte Buddy 創始者
Java チャンピオン)
Lukas Eder
(jOOQ 創設者
Java チャンピオン)
Markus Eisele
(Red Hat テクニカルエバンジェリスト
Java チャンピオン)
JDBCを直接使用する場合でも、JPAやHibernateを介して使用する場合でも、そのパフォーマンスへの影響をこれ以上にうまくまとめた資料はありません。
この本は、Javaアプリケーションでリレーショナルデータベースの性能を極限まで引き出したいすべての開発者にとって必読の書です。
Vladは自身の膨大な経験を読みやすい一冊の本にまとめ上げました。JPAやHibernateを扱うなら、必ず読むべき一冊です。
実習環境
OS:Windows、macOS、Linuxのすべてが可能
必須ツール: JDK 17以上、IntelliJ IDEAまたはEclipse IDE
ビルドツール: Maven, Gradle
推奨仕様:8GB以上のRAMと十分なディスク容量
前提知識および注意事項
JavaおよびSpringフレームワークの基本知識
Spring Data JPAの使用経験 (JpaRepository, @Entity)
基本的な関係データベース(RDB)およびSQLの知識
実務でSpringベースの開発経験があれば、より効果的です。
学習資料
講義スライドのPDFファイルを提供します。
実習コードはGitHubリポジトリを通じて提供される予定です。
各セクションの最後に、講義内容を復習できるクイズがあります。
他のJPA性能講義の受講は必須ではありません。
受講済みであれば、深化された内容をより深く理解できる、代替ではなく補完関係にある講義です。
フェッチジョインやbatch_fetch_sizeのような基本的な最適化を超えた深化課程です。
Q. フェッチジョインやbatch_fetch_size程度は知っていますが、この講義は必要ですか?
はい、まさにその地点から始まる講義です。この講義はその次の段階である書き込み(Write)とDBレイヤーの最適化を扱います。
Q. 既存の「高性能JPA & Hibernate」講座とは何が違うのですか?
既存の講義はEntityManager/Session APIを直接使用し、Hibernateエンジンの内部動作原理を扱います。
この講義はJpaRepositoryと@Transactionalを使用するSpring Data JPA環境で実際に直面するパフォーマンス問題を解決します。
同じ「Batching」というテーマでも、既存の講義は「JDBC Batchがどのように動作するか」を、この講義は「なぜSpring DataでsaveAll()をしてもバッチ処理が行われないのか」を扱います。
Q. JPA/Hibernateをどの程度知っておく必要がありますか?
Spring Data JPAでCRUDを実装した経験があれば十分です。JpaRepository、@Entity、@Transactionalを使用したことがあるレベルであれば、すべての内容についていくことができます。既存の講義(高性能JPA & Hibernate)を受講していればより深く理解できますが、必須ではありません。, 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. 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 bắt buộc.
Q. どのデータベースを使用しますか?
MySQL、PostgreSQL、Oracle、SQL Serverの4つのDBにおける比較ベンチマークを提供します。
H2ではなく、実際のプロダクションDB環境でテストする方法も扱います。
学習対象は
誰でしょう?
既存のJPA性能講義を受講した後、次の段階の性能最適化が必要な方
フェッチジョインと batch_fetch_size までは適用したけれど、その次に何をすべきかわからない方
save() を呼び出すたびに予想外のクエリが実行される経験をしたが、原因を見つけられなかった方
JPAのパフォーマンスチューニングは経験があるが、DBレイヤーまで踏み込んだことはない方
実務で大容量データを扱いながら、照会だけでなく書き込みパフォーマンスまで確保しなければならない方
前提知識、
必要でしょうか?
Spring Data JPAの使用経験
基本的な Spring Framework / Spring Boot の知識
基本的な関係データベース(RDB)およびSQLの知識
インフラン認証
1,433
受講生
79
受講レビュー
4.5
講座評価
3
講座
私の名前はVlad Mihalceaです。Java Championであり、Amazonで最も売れているJava関連書籍の一つとなったHigh-Performance Java Persistenceの著者でもあります。
私は現在、素晴らしいHypersistence Optimizerを開発しており、空いた時間にはさまざまなオープンソースプロジェクト(Hypersistence UtilsやFlexyPoolなど)の開発や、StackOverflowでの回答活動を行っています。
私はJavaチャンピオンであり、Hibernate ORMプロジェクトの主要なコントリビューターです。アプリケーションの構成とマッピングをスキャンし、データアクセス層の速度を向上させるために必要な変更を提案するツール、Hypersistence Optimizerを開発しました。
StackOverflowでHibernate、Java、JPAタグに関連する数千の質問に回答し、ゴールドバッジを獲得しました。
興味深い発見をすると、個人ブログで共有することを好みます。彼はオープンソースソフトウェアを信頼しており、すべての開発者が何らかの形で貢献すべきだと考えています。
適切なツールが見つからなければ、Hypersistence UtilsやFlexyPoolのような新しいオープンソースプロジェクトを立ち上げることもあります。
全体
41件 ∙ (6時間 17分)
講座資料(こうぎしりょう):
3. スキーマ管理
09:53
4. ステートメントのログ記録
07:28
5. テストのベストプラクティス
05:58
6. 型カテゴリとコンパクトな列
10:29
8. 非標準カラム型
04:58
9. ナチュラルキーとサロゲートキー
06:42
10. 割り当てられた識別子
06:01
11. 生成された識別子
08:46
12. 識別子のポータビリティ
05:28
全体
3件
知識共有者の他の講座を見てみましょう!
同じ分野の他の講座を見てみましょう!