ハイパフォーマンスSpring Persistence(High-Performance Spring Persistence)

フェッチジョインと batch_fetch_size の次、その先のステップの JPA パフォーマンス最適化を扱う講義です。 JPA を超えて Hibernate ・ JDBC ・ DB エンジンまで — 水面下のレイヤーの動作原理を理解し、設定一行で 18 倍のパフォーマンス差を生む 7 つの戦略を学習します。 照会(Read)の最適化にとどまらず、書き込み(Write)パフォーマンスや関連関係の罠、プロダクションテスト環境まで Spring Persistence 全体をチューニングします。 Java Champion であり Hibernate の核心的なコントリビューターである Vlad Mihalcea が、Spring Data JPA の限界を解決するために自ら作成したツールと経験をもとに教えます。

難易度 中級以上

受講期間 無制限

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

受講後に得られること

  • 不要なSELECTを削除し、大量INSERTのパフォーマンスを10倍以上改善する方法を学びます。

  • 数百万件のデータでも、ページ数に関係なく一定の照会速度を維持する戦略を学びます。

  • 設定一行の差が生む18倍の性能格差を、4つのDBベンチマーク数値で直接体感します。



グローバルJavaチャンピオンから学ぶ

高パフォーマンスSpring Persistence 講座


高性能なデータアクセス層は、その下のデータベースと呼吸が合っていなければなりません。
JPAを超えて Hibernate・JDBC・DBまで — データアクセス層全体を最適化する旅です。


もしかして、このような経験はありませんか?


→ JpaRepository.saveAll()がエンティティの数だけ不要なSELECTを飛ばしているのを発見したことはありますか?

→ @DynamicUpdateを有効にしたら、むしろパフォーマンスが低下した経験はありませんか?

→ OFFSETベースのページネーションが後ろに行くほど20倍遅くなる原因がわからないなら?

→ 10万件の照会時、設定一行の差で550ms → 30ms (18倍改善)が可能であることをご存知ですか?

JPAは氷山の一角
核心は「水面下」


データアクセス層がDBと足並みを揃えるには、
水面下のHibernate・JDBC・データベースエンジンの動作原理を知る必要があります。

この差が、高性能なアプリケーションと、かろうじて動作するアプリケーションを分けるのです。



講義で学ぶ内容

スプリングのパフォーマンスを向上させる7つの最適化戦略


エンティティマッピングからバッチ処理、関連性の罠、遅延読み込み、テスト環境まで
— Spring Persistence性能チューニングの核心戦略を学習します。


性能を考慮したデータモデルと識別子設計

多くの開発者が@Idアノテーションを付けることだけに集中していますが、どの識別子戦略を選択するかが書き込みパフォーマンスを決定します。save()が新しいエンティティであるにもかかわらずSELECTを実行する理由や、特定のID戦略がバッチ処理を妨げる理由を学習します。

Before

よく使われるID戦略 + save()
→ バッチINSERT不可、エンティティごとに1件ずつINSERT

After

ID戦略と保存方式の変更
→ JDBCバッチで大量のINSERTを一括処理


永続性コンテキストの動作原理とFlushメカニズム

「意図しないUPDATEクエリがなぜこんなに多いのか?」 — 「SQLが実行されるタイミング」を、もはや推測に任せることはありません。Dirty Checkingの内部動作を分析し、@DynamicUpdateの真の使用基準を学びます。

Before

@DynamicUpdateの無闇な使用
→ かえって別の性能問題を誘발

After

状況別の判断基準確立
→ 不必要なUPDATEの除去 + キャッシュの維持


JDBCバッチ処理とStatementキャッシング

for文の中でsave()を繰り返し呼び出すと、1万件を超えるだけでも深刻なパフォーマンス低下に直面します。JPAの基本動作だけでは解決できない限界を超え、JDBCバッチ処理とStatementキャッシングを実戦に適用します。

Before

saveAll()呼び出し時にエンティティの数だけ
SELECT + INSERT 個別実行

After

保存メソッドの入れ替え+ JDBC Batching
→ SELECT 0件 + バッチ INSERT


N+1を回避するFetch戦略

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の正常動作


本番DBベースの性能テスト

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倍改善

  • コレクションのページング
    ページ数に関係なく一定の速度を維持

  • DTOプロジェクション
    Spring Data専用の軽量クエリ手法

  • 大量のINSERT
    設定と戦略の変更でバッチINSERTを活性化

  • save()のオーバーヘッド
    エンティティの数だけ発生する不要なSELECTを完全に除去

  • @DynamicUpdate
    使うべき時 vs 使うべきではない時、判断基準を提示

  • 関連関係の落とし穴
    Lazy失敗、不必要なテーブル生成など実戦での落とし穴を解決

  • 本番DBテスト
    本番と同一の環境でデプロイ前の事前検証

この講義を作った人

世界中の開発者が信頼するエキスパート
Vlad Mihalcea


  • 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の性能の限界を解決するために、自ら代替ライブラリを作った人物です。
この講義では、彼がなぜこのツールを作ったのか、どのような問題を解決するのかを直接学びます。


世界中のJavaチャンピオンたちの推薦文を確認してください!


Rafael Winterhalter
(Byte Buddy 創始者
Java チャンピオン)

Lukas Eder
(jOOQ 創設者
Java チャンピオン)

Markus Eisele
(Red Hat テクニカルエバンジェリスト
Java チャンピオン)

JDBCを直接使用する場合でも、JPAやHibernateを通じて使用する場合でも、そのパフォーマンスへの影響をこれほど見事にまとめた資料は他にありません。

この本は、Javaアプリケーションでリレーショナルデータベースの性能を極限まで引き出そうとするすべての開発者にとっての必読書です。

Vladは自身の膨大な経験を読みやすい一冊の本にまとめ上げました。JPAやHibernateを扱うなら、必ず読むべき一冊です。



🎉 新規講座オープン記念 特別EVENT 🎉

高パフォーマンスSpring Persistence講座のオープンを記念して、全講座の割引イベントを期間限定で実施します!

特典1) 個別講義 40% 割引
高性能JPA & Hibernate
JPA (ORM) 開発者のための高性能SQL
---

特典2) ロードマップで購入時、50%割引
世界的なJavaチャンピオン、Vlad Mihalcea 講義ロードマップ

受講前のご注意事項

現在、最後のセクションである「Fetching最適化」パートが連載(アップデート)中です。
今後、以下のようなテーマが順次扱われる予定ですので、学習の参考にしてください。

<アップデート予定リスト>

  • エンティティフェッチング(entity fetching)

  • エンティティ関連付け (FetchType.EAGER, FetchType.LAZY, LazyInitializationException, JOIN FETCH, Blaze Persistence MULTISET)

  • ストリーム処理(Stream processing)

  • クエリプランキャッシュ (Query Plan Cache)

実習環境

  • 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講義との関連性

  • 他の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)を受講していればより深く理解できますが、必須ではありません。

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の知識

こんにちは
Vlad Mihalceaです。

1,369

受講生

77

受講レビュー

4.5

講座評価

3

講座

私の名前はVlad Mihalceaです。Java Championであり、Amazonで最も売れているJava関連書籍の一つとなったHigh-Performance Java Persistenceの著者でもあります。

私は現在、素晴らしいHypersistence Optimizerを開発しており、空いた時間にはさまざまなオープンソースプロジェクト(Hypersistence UtilsFlexyPoolなど)の開発や、StackOverflowでの回答活動を行っています。

私はJavaチャンピオンであり、Hibernate ORMプロジェクトの主要なコントリビューターです。アプリケーションの構成とマッピングをスキャンし、データアクセス層の速度を向上させるために必要な変更を提案するツール、Hypersistence Optimizerを開発しました。

StackOverflowでHibernate、Java、JPAタグに関連する数千の質問に回答し、ゴールドバッジを獲得しました。

興味深い発見をすると、個人ブログで共有することを好みます。彼はオープンソースソフトウェアを信頼しており、すべての開発者が何らかの形で貢献すべきだと考えています。

適切なツールが見つからなければ、Hypersistence UtilsFlexyPoolのような新しいオープンソースプロジェクトを立ち上げることもあります。

もっと見る

カリキュラム

全体

37件 ∙ (5時間 57分)

講座資料(こうぎしりょう):

授業資料
講座掲載日: 
最終更新日: 

受講レビュー

全体

2件

5.0

2件の受講レビュー

  • shyoon135530님의 프로필 이미지
    shyoon135530

    受講レビュー 1

    平均評価 5.0

    5

    31% 受講後に作成

    • coiio님의 프로필 이미지
      coiio

      受講レビュー 6

      平均評価 5.0

      5

      35% 受講後に作成

      似ている講座

      同じ分野の他の講座を見てみましょう!

      期間限定セール、あと8日日で終了

      ¥140,250

      50%

      ¥35,603