Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
Chihiro Ito
PDF, PPTX
14,620 views
JPAのキャッシュを使ったアプリケーション高速化手法
JPOUG Tech Talk Night #2 で話した内容に飲み会で質問された内容を加えています。
Technology
◦
Read more
23
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 59
2
/ 59
3
/ 59
4
/ 59
5
/ 59
Most read
6
/ 59
7
/ 59
8
/ 59
9
/ 59
10
/ 59
11
/ 59
12
/ 59
13
/ 59
14
/ 59
15
/ 59
16
/ 59
17
/ 59
18
/ 59
19
/ 59
20
/ 59
21
/ 59
22
/ 59
23
/ 59
24
/ 59
25
/ 59
26
/ 59
27
/ 59
28
/ 59
29
/ 59
30
/ 59
31
/ 59
32
/ 59
33
/ 59
34
/ 59
35
/ 59
36
/ 59
Most read
37
/ 59
38
/ 59
39
/ 59
40
/ 59
41
/ 59
42
/ 59
43
/ 59
44
/ 59
45
/ 59
46
/ 59
47
/ 59
48
/ 59
49
/ 59
50
/ 59
51
/ 59
52
/ 59
53
/ 59
54
/ 59
55
/ 59
Most read
56
/ 59
57
/ 59
58
/ 59
59
/ 59
More Related Content
PDF
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
by
Takahiro YAMADA
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
by
NTT DATA Technology & Innovation
PDF
Javaのログ出力: 道具と考え方
by
Taku Miyakawa
PDF
Mavenの真実とウソ
by
Yoshitaka Kawashima
PDF
超実践 Cloud Spanner 設計講座
by
Samir Hammoudi
PPTX
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
PPTX
GraphQLのsubscriptionで出来ること
by
Shingo Fukui
これからのJDK 何を選ぶ?どう選ぶ? (v1.2) in 熊本
by
Takahiro YAMADA
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
by
NTT DATA Technology & Innovation
Javaのログ出力: 道具と考え方
by
Taku Miyakawa
Mavenの真実とウソ
by
Yoshitaka Kawashima
超実践 Cloud Spanner 設計講座
by
Samir Hammoudi
AlloyDBを触ってみた!(第33回PostgreSQLアンカンファレンス@オンライン 発表資料)
by
NTT DATA Technology & Innovation
GraphQLのsubscriptionで出来ること
by
Shingo Fukui
What's hot
PDF
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
by
Chihiro Ito
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
by
NTT DATA Technology & Innovation
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
by
onozaty
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
by
pospome
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
by
Naoya Kishimoto
PPTX
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
PPTX
KeycloakでAPI認可に入門する
by
Hitachi, Ltd. OSS Solution Center.
PDF
Linux女子部 systemd徹底入門
by
Etsuji Nakai
PDF
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
by
Google Cloud Platform - Japan
PDF
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
KEY
やはりお前らのMVCは間違っている
by
Koichi Tanaka
PPTX
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
by
NTT DATA Technology & Innovation
PDF
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
by
NTT DATA Technology & Innovation
PDF
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
by
Google Cloud Platform - Japan
PDF
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
PPTX
入門!Jenkins
by
Shuntaro Saiba
PDF
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
by
NTT DATA Technology & Innovation
PDF
ストリーム処理を支えるキューイングシステムの選び方
by
Yoshiyasu SAEKI
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
Javaはどのように動くのか~スライドでわかるJVMの仕組み
by
Chihiro Ito
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
by
NTT DATA Technology & Innovation
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
by
onozaty
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
by
pospome
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
by
Naoya Kishimoto
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
KeycloakでAPI認可に入門する
by
Hitachi, Ltd. OSS Solution Center.
Linux女子部 systemd徹底入門
by
Etsuji Nakai
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
by
Google Cloud Platform - Japan
イミュータブルデータモデルの極意
by
Yoshitaka Kawashima
やはりお前らのMVCは間違っている
by
Koichi Tanaka
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
by
NTT DATA Technology & Innovation
マルチテナント化で知っておきたいデータベースのこと
by
Amazon Web Services Japan
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
by
NTT DATA Technology & Innovation
GKE に飛んでくるトラフィックを 自由自在に操る力 | 第 10 回 Google Cloud INSIDE Games & Apps Online
by
Google Cloud Platform - Japan
イミュータブルデータモデル(世代編)
by
Yoshitaka Kawashima
入門!Jenkins
by
Shuntaro Saiba
Dapr × Kubernetes ではじめるポータブルなマイクロサービス(CloudNative Days Tokyo 2020講演資料)
by
NTT DATA Technology & Innovation
ストリーム処理を支えるキューイングシステムの選び方
by
Yoshiyasu SAEKI
Viewers also liked
PDF
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
PDF
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
by
kwatch
PDF
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
by
Uptime Technologies LLC (JP)
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
by
kwatch
PDF
Java EE 再入門
by
minazou67
PDF
Hello Java
by
Chihiro Ito
PPTX
Java EE パフォーマンスTips #glassfish_jp
by
Norito Agetsuma
PDF
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
by
Toshiaki Maki
PDF
はまる!!JPA #glassfish_jp #javaee
by
Toshiaki Maki
PDF
磯野ー!関数型言語やろうぜー!
by
Ra Zon
PDF
たのしい高階関数
by
Shinichi Kozake
PDF
Java女子部 Java EEハンズオン(応用編)
by
Misaki Kajiura
PDF
金魚本に載ってないJpqlの話 #glassfishjp
by
Satoshi Kubo
PDF
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
by
Toshiaki Maki
PPTX
CPU Caches
by
shinolajla
PDF
Java EEの話(仮)
by
Satoshi Kubo
PPT
JPA説明会
by
Ryo Asai
PDF
Java EE7 䛸㻌JCache
by
maruyama097
PDF
Spring勉強会
by
gaaupp
PDF
そんなリザルトキャッシュで大丈夫か? #jjug
by
Toshiaki Maki
O/Rマッパーによるトラブルを未然に防ぐ
by
kwatch
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
by
kwatch
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
by
Uptime Technologies LLC (JP)
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
by
kwatch
Java EE 再入門
by
minazou67
Hello Java
by
Chihiro Ito
Java EE パフォーマンスTips #glassfish_jp
by
Norito Agetsuma
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
by
Toshiaki Maki
はまる!!JPA #glassfish_jp #javaee
by
Toshiaki Maki
磯野ー!関数型言語やろうぜー!
by
Ra Zon
たのしい高階関数
by
Shinichi Kozake
Java女子部 Java EEハンズオン(応用編)
by
Misaki Kajiura
金魚本に載ってないJpqlの話 #glassfishjp
by
Satoshi Kubo
Spring4とSpring Bootで作る次世代Springアプリケーション #jjug #jsug
by
Toshiaki Maki
CPU Caches
by
shinolajla
Java EEの話(仮)
by
Satoshi Kubo
JPA説明会
by
Ryo Asai
Java EE7 䛸㻌JCache
by
maruyama097
Spring勉強会
by
gaaupp
そんなリザルトキャッシュで大丈夫か? #jjug
by
Toshiaki Maki
Similar to JPAのキャッシュを使ったアプリケーション高速化手法
PPT
Spring3.1概要 データアクセスとトランザクション処理
by
土岐 孝平
PPTX
Coherenceを利用するときに気をつけること #OracleCoherence
by
Toshiaki Maki
PPTX
はじめてのJPA
by
kawaba
PDF
Caching ガイダンスの話
by
Sunao Tomita
PDF
[D14] 【詳解】インメモリーデータベース SAP HANA:実際の仕組みと動きを理解しよう!by Toshiro Morisaki
by
Insight Technology, Inc.
PDF
Apache Torqueについて
by
tako pons
PDF
JJUG CCC 2017 Spring LT about JPA
by
Naoya Kojima
PPT
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
by
lalha
PPTX
Beginning Java EE 6 勉強会(2) #bje_study
by
Kinji Akemine
PDF
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
by
Masahiro Wakame
PPTX
JPAの基礎と現場で役立つ開発Tips
by
yuichi_kuwahara
PDF
Spring Data in a Nutshell
by
Tsuyoshi Miyake
PDF
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
by
yoyamasaki
PPTX
Google fusion tables api v1.0 tips
by
Wataru Sato
PPTX
Reladomo入門 JJUGナイトセミナー #jjug
by
Hiroshi Ito
PDF
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
by
Yusaku Watanabe
PDF
金魚本読書ノート JPA編
by
Kazuyoshi Kamitsukasa
PPT
Gaej Jdo
by
katsu.taira
PDF
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ↔ クラウド ↔ クラウド” by 株式会社インサイトテクノロジー 森田俊哉
by
Insight Technology, Inc.
Spring3.1概要 データアクセスとトランザクション処理
by
土岐 孝平
Coherenceを利用するときに気をつけること #OracleCoherence
by
Toshiaki Maki
はじめてのJPA
by
kawaba
Caching ガイダンスの話
by
Sunao Tomita
[D14] 【詳解】インメモリーデータベース SAP HANA:実際の仕組みと動きを理解しよう!by Toshiro Morisaki
by
Insight Technology, Inc.
Apache Torqueについて
by
tako pons
JJUG CCC 2017 Spring LT about JPA
by
Naoya Kojima
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
by
lalha
Beginning Java EE 6 勉強会(2) #bje_study
by
Kinji Akemine
Datastoreへのアクセスを楽してMemcacheアクセスに置き換えるライブラリ作った
by
Masahiro Wakame
JPAの基礎と現場で役立つ開発Tips
by
yuichi_kuwahara
Spring Data in a Nutshell
by
Tsuyoshi Miyake
MySQL Cluster 解説 & MySQL Cluster 7.3 最新情報
by
yoyamasaki
Google fusion tables api v1.0 tips
by
Wataru Sato
Reladomo入門 JJUGナイトセミナー #jjug
by
Hiroshi Ito
WEB開発を加速させる。アジャイル開発に最適なデータ構造とORマッパの形
by
Yusaku Watanabe
金魚本読書ノート JPA編
by
Kazuyoshi Kamitsukasa
Gaej Jdo
by
katsu.taira
20151120_ビッグデータ/クラウドにデータ連携自由自在 “オンプレミス ↔ クラウド ↔ クラウド” by 株式会社インサイトテクノロジー 森田俊哉
by
Insight Technology, Inc.
More from Chihiro Ito
PDF
Quarkus による超音速な Spring アプリケーション開発
by
Chihiro Ito
PDF
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
by
Chihiro Ito
PDF
Getting started MySQL as Document Data Store
by
Chihiro Ito
PDF
Oracle code one 2018 報告会概要
by
Chihiro Ito
PDF
Java Flight Recorderの紹介 at Java Day Tokyo 2015
by
Chihiro Ito
PDF
Advanced database monitoring in modern java
by
Chihiro Ito
PDF
Red Hat Data Grid 8.2 新機能
by
Chihiro Ito
PDF
Red Hat Data Grid 8.1 新機能
by
Chihiro Ito
PDF
Quarkusのビジネスと技術的な価値
by
Chihiro Ito
PDF
システムのモダナイズ 落ちても良いアプリの作り方
by
Chihiro Ito
PDF
JDKツール使ってますか
by
Chihiro Ito
PDF
Quarkus Technical Deep Dive - Japanese
by
Chihiro Ito
Quarkus による超音速な Spring アプリケーション開発
by
Chihiro Ito
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
by
Chihiro Ito
Getting started MySQL as Document Data Store
by
Chihiro Ito
Oracle code one 2018 報告会概要
by
Chihiro Ito
Java Flight Recorderの紹介 at Java Day Tokyo 2015
by
Chihiro Ito
Advanced database monitoring in modern java
by
Chihiro Ito
Red Hat Data Grid 8.2 新機能
by
Chihiro Ito
Red Hat Data Grid 8.1 新機能
by
Chihiro Ito
Quarkusのビジネスと技術的な価値
by
Chihiro Ito
システムのモダナイズ 落ちても良いアプリの作り方
by
Chihiro Ito
JDKツール使ってますか
by
Chihiro Ito
Quarkus Technical Deep Dive - Japanese
by
Chihiro Ito
Recently uploaded
PDF
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
PDF
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
PDF
自転車ユーザ参加型路面画像センシングによる点字ブロック検出における性能向上方法の模索 (20260123 SeMI研)
by
Yuto Matsuda
PDF
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
PDF
ST2024_PM1_2_Case_study_of_local_newspaper_company.pdf
by
akipii ogaoga
PDF
Team Topology Adaptive Organizational Design for Rapid Delivery of Valuable S...
by
akipii ogaoga
PDF
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
PDF
PMBOK 7th Edition Project Management Process Scrum
by
akipii ogaoga
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
PDF
FY2025 IT Strategist Afternoon I Question-1 Balanced Scorecard
by
akipii ogaoga
PDF
PMBOK 7th Edition_Project Management Context Diagram
by
akipii ogaoga
PDF
PMBOK 7th Edition_Project Management Process_WF Type Development
by
akipii ogaoga
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
自転車ユーザ参加型路面画像センシングによる点字ブロック検出における性能向上方法の模索 (20260123 SeMI研)
by
Yuto Matsuda
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
ST2024_PM1_2_Case_study_of_local_newspaper_company.pdf
by
akipii ogaoga
Team Topology Adaptive Organizational Design for Rapid Delivery of Valuable S...
by
akipii ogaoga
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
PMBOK 7th Edition Project Management Process Scrum
by
akipii ogaoga
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
FY2025 IT Strategist Afternoon I Question-1 Balanced Scorecard
by
akipii ogaoga
PMBOK 7th Edition_Project Management Context Diagram
by
akipii ogaoga
PMBOK 7th Edition_Project Management Process_WF Type Development
by
akipii ogaoga
JPAのキャッシュを使ったアプリケーション高速化手法
1.
JPAのキャッシュを使った アプリケーション高速化手法 伊藤智博
2.
ここで示されている見解は 私個人のものであり、 所属会社の見解を 反映したものではありません 2
3.
注意 • 都合上、省略している部分もあります • スペースの都合上、SQLでは*を多用します •
DBの表名やJavaのクラス名などは論理名を使用します • JPAの実装系により、動作が異なる可能性があります 3
4.
目次 4 • 自己紹介 • JPAとは •
キャッシュの効果 • キャッシュ使う前に • N+1問題を考える • よくある改善策 • キャッシュならではの改善策 • キャッシュチューニング
5.
自己紹介 • 名前: – 伊藤
智博(いとう ちひろ) • 勤務先: – 日本オラクル株式会社 • 仕事で使う製品/技術: – Java EE/SE/ME, JVM, OEP, Coherence, SQL • 連載: – Javaはどのように動くのか~図解でわかるJVMの仕組み – http://gihyo.jp/dev/serial/01/jvm-arc 5
6.
はじめに • データベースにアクセスしないシステムは存在します。 • その理由は、 –
データを保存しない – 保存先をデータベースにする必要は無く、ファイルで十分 – データベースにアクセスしていたら処理が間に合わない • という理由でしょう 6
7.
はじめに • DBにアクセスしたら負けな処理は存在し、その多くはメモリ にデータをキャッシュすることで処理時間を短縮します • 他のシステムでもメモリにデータをキャッシュすれば処理時 間の短縮を見込めますが、メモリは揮発性のため永続化は難 しく、メモリ<->DB間での永続化の仕組みが必要です •
自分でこんな仕組みを作るのは難しいです • そんな時は、JPAを使いましょう! 7
8.
JPAとは? 8
9.
JPAって何なの? • JPA は
Java Persistence API の略です。 • Java の規格である JSR317 として策定 • 以下の3つからなる – API (javax.persistenceパッケージ) – Java Persistence Query Language (JPQL) – オブジェクト/関係メタデータ 9 出典:wikipedia
10.
JPAって何ができるの? • Entity の自動生成ができます •
JPQL / Criteria API / Native Queryによる問い合わせ • IDE による JPQL のコードチェック • キャッシュ 10 今回はキャッシュのお話しです
11.
キャッシュの効果 11
12.
キャッシュの効果 • アプリの処理時間短縮 • Entityオブジェクトの共有 •
SQL実行の負荷低減 12
13.
キャッシュの効果 -処理時間短縮 13 SELECT *
FROM 顧客 WHERE 顧客ID = 1 O/R Get顧客(1) 1 2 SELECT * FROM 顧客 WHERE 顧客ID = 2 顧客ID 名前 都道府県ID 2 BBB 1 顧客ID 名前 都道府県ID 1 AAA 1 Get顧客(2) ここでDBのデータから JavaのEntityを作成する SELECT * FROM 顧客 WHERE 顧客ID = 1Get顧客(1) 1 顧客ID 名前 都道府県ID 1 AAA 1 同じデータが何度もネットワークを通過する As-is アプリ DB
14.
キャッシュの効果 -処理時間短縮 14 SELECT *
FROM 顧客 WHERE 顧客ID = 1 JPA Get顧客(1) 1 2 SELECT * FROM 顧客 WHERE 顧客ID = 2 顧客ID 名前 都道府県ID 2 BBB 1 顧客ID 名前 都道府県ID 1 AAA 1 Get顧客(2) キャッシュされたEntityを返すため、 Entity作成処理が不要 Get顧客(1) 1 キャッシュされる 1 キャッシュに無いのはDBに取り行くTo-Be キャッシュにあるから DBに問い合わせしない アプリ DB
15.
キャッシュの効果 -Entityオブジェクトの共用 15 SELECT *
FROM 顧客 WHERE 顧客ID = 1 O/R Get顧客(1) 1 顧客ID 名前 都道府県ID 1 AAA 1 複数スレッドで同じ処理をしていると、 スレッド数分だけリソースを消費する SELECT * FROM 顧客 WHERE 顧客ID = 1Get顧客(1) 1 顧客ID 名前 都道府県ID 1 AAA 1 As-is DB
16.
キャッシュの効果 -Entityオブジェクトの共用 16 DB SELECT *
FROM 顧客 WHERE 顧客ID = 1 JPA Get顧客(1) 1 顧客ID 名前 都道府県ID 1 AAA 1 複数スレッドで同じ処理をしていると、 最初に処理したスレッドがキャッシュに載せて、 他のスレッドはキャッシュのEntityを使う Get顧客(1) 1 1 キャッシュにあるから このスレッドでは DBに問い合わせしない To-Be
17.
キャッシュの効果 -SQLの負荷低減の例 • SELECT
顧客.*, 血液型.*, 性別.*, 都道府県.*, 郵便番 号.* FROM 顧客 JOIN 血液型 ON (顧客.血液型ID = 血液型.ID) JOIN 性別 ON (顧客.性別ID = 性別.ID) JOIN 都道府県 ON (顧客.都道府県ID = 都道府県.ID) JOIN 郵便番号 ON (顧客.郵便番号ID = 郵便番号.ID) WHERE 年齢 = ? 17 実際は*ではなく、各カラムが羅列されます 5つのテーブルを結合するのか、 大変だなぁ As-is
18.
キャッシュの効果 -SQLの負荷低減の例 • キャッシュを使うと、外部キーでの参照は参照先のオブ ジェクトがキャッシュにあればキャッシュから取れます。 •
そのため、SQLでJoinする必要がなくなり、DB側のI/O やJoin処理が無くなります。 • SELECT * FROM 顧客 WHERE 年齢 = ? 18 実際は*ではなく、各カラムが羅列されます 結合が無くなった♪ To-Be Joinの無くなったSQL
19.
キャッシュを使う前に 19
20.
キャッシュの種類 • 以下の2つのキャッシュがあります。 • Entityキャッシュ –
Key-Valueの組み合わせでキャッシュされます – 主キー(複合キーも可能)をKeyとして、Entity(レコードに相当) をValueとして取得します • 問合せ結果キャッシュ – 問合せとパラメータの組合せで問合せ結果をキャッシュします 20 今回はEntityキャッシュを 重点的に紹介します
21.
検討項目 • キャッシュ対象を決めるために以下を検討しましょう – アクセス方法 •
どのようにデータにアクセスするのか – データ数 • データはどのくらいあるのか 21
22.
アクセス方法とは • データにどのようにアクセスするかを確認します – 主キーによるアクセス •
例:SELECT * FROM 顧客 WHERE 顧客ID = ? – 主キー以外によるアクセス • 例:SELECT * FROM 顧客 WHERE 都道府県ID = ? 顧客ID 名前 都道府県ID 1 AAA 1 2 BBB 1 3 CCC 2 主キー 外部キー 都道府県ID 名前 1 XXX 2 YYY 主キー 外部キーを辿るのも主キー によるアクセスです 22
23.
データ数 • キャッシュサイズの概算見積もり方法 – キャッシュするデータ数
× データのオブジェクトサイズ • データ数が多いとヒープをたくさん使います。 23
24.
アクセス方法とデータ量での分類 24 ここに挙げているデータは一例であり、 システムによってデータ数とアクセス方法は変わる可能性があります。 血液型 性別 都道府県 郵便番号 顧客 受注 注文 発注 少ない 多い 主キー 主キー以外データ数 アクセス方法
25.
アクセス方法とデータ量での分類 • Entityキャッシュと相性が良いパターン • 主キーによるアクセス/データ量が少ない –
Entityキャッシュとの相性は非常に高い – 更新が無ければDatabaseに入れずEnumにしてしまうのもアリ – 例:血液型、性別など • データ量問わず主キーによるアクセスがほとんど – 全てキャッシュしきれない場合は、アクセス数の多いもの(Hot データ)のみをキャッシュする – 例:都道府県、郵便番号、顧客 25
26.
アクセス方法とデータ量での分類 • 問合せ結果キャッシュと相性が良いもの • 主キー以外でのアクセスが多いがパターンが限られてい る –
顧客を年齢や性別で検索などはコレと相性が良い。 – パターンが多いが殆どは特定のパターンしか使わない場合は、 使用頻度の高いHotパターンのみをキャッシュする – 例:受注、注文、発注で日付が新しい物だけをキャッシュ 26
27.
アクセス方法とデータ量での分類 27 血液型 性別 都道府県 郵便番号 顧客 受注 注文 発注 少ない 多い 主キー 主キー以外 Entity キャッシュ Enum Hotデータのみを Entity
キャッシュ 問合せ結果 キャッシュ DB データ量 アクセス方法 今回の範囲
28.
N+1問題を考える 28
29.
要件 • 顧客とその居住都道府県の情報をDBへ問い合わせます 29 DB 顧客表:n行 都道府県表:m行 一般的には n
> m (≒47) 問い合わせ(SQL) 結果 アプリ
30.
サンプルソース 30 //顧客情報をn件取得 List<顧客> custs =
findAll(); for(顧客 c : custs ){ //顧客の居住地を1件取得 都道府県 pref = c.get居住地(); } n回実行 1回実行 顧客毎の居住地を取得する 顧客情報を全て 取得する
31.
N+1問題とは • SQL で顧客情報
n 行の結果を取得(1回) • 顧客情報を使って都道府県情報を問い合わせ(n回) 31 DB SELECT * FROM 顧客 DB SELECT * FROM 都道府県 WHERE 都道府県ID = 顧客.居住地顧客 参照 1件ずつ取得
32.
SELECT * FROM
都道府県 ・・・ SELECT * FROM 都道府県 ・・・ シーケンス 32 顧客ID 名前 都道府県ID 1 AAA 1 2 BBB 1 3 CCC 2 DB SELECT * FROM 顧客 SELECT * FROM 都道府県 WHERE 都道府県ID = 1 都道府県ID 名前 2 YYY 都道府県ID 名前 1 XXX findAll() O/R 1 2 3 .get居住地() 1 .get居住地() 1 .get居住地() 2 1 2 3 都道府県ID 名前 1 XXX n回SQLが 発効される n件取得
33.
よくある改善策は? 33
34.
N+1問題 -よくある改善策 • 最初から結合しておく 34 DB SELECT
* FROM 顧客 c JOIN 都道府県 p ON (c.居住地 = p.都道府県ID) 結合された結果 結合したSQL
35.
シーケンス -よくある改善策 35 顧客ID 名前
都道府県ID 1 AAA 1 2 BBB 1 3 CCC 2 DB SELECT * FROM 顧客 JOIN 都道府県 p ON (c.居住地 = p.都道府県ID) findAll() O/R 1 2 3 .get居住地() 1 .get居住地() 1 .get居住地() 2 1 2 3 1 2 最初から紐付ける 都道府県ID 名前 1 XXX 1 XXX 2 YYY 結合した結果を取得する 最初から紐付いてる Entityを返す N+1から1に 減った
36.
36 SQLでは簡単にJoinできるので よくある改善策だけど、 JPAではどうすれば実現できるの?
37.
結合したSQLが発行されるようにするには • JPQL に
JOIN FETCH を付けて結合する • フィールドに @JoinFetch を付与 37 SELECT c FROM 顧客 c JOIN FETCH c.居住地 @JoinFetch @OneToOne private 都道府県 居住地 または 都道府県を保存し ているフィールド
38.
38 とりあえず、N+1問題避けるために 全関係に @JoinFetch 付けとこうぜ!
39.
全部Join Fetchだと、どうなるの? • 最初から関係する表を全てJoin
Fetchしておくと、 • SQLでは全ての表が結合されるため膨大になってしまう 39 SELECT * FROM 顧客 c JOIN 都道府県 p ON (c.居住地 = p.都道府県ID) ・・・(略)・・・ 処理に使わない表まで結合すると・・・ ・DBの結合処理が無駄 ・Entityオブジェクト作成処理が無駄 DB
40.
全部に @JoinFetch してはいけない •
一対多のように、 相手が多の関係が増えるとSQLの結果が爆発的に増加 • キャッシュに乗っていればEntityが使われますが、 乗っていなければEntityが作成されるため、 Java側の使用オブジェクト数も爆発的に増加する 40
41.
@JoinFetch をどう使うのか • “必ず”セットで使うものを
@JoinFetch する • それ以外は処理に応じてJPQL で JOIN FETCHする 41
42.
42 Join Fetchしたし、N+1問題も解決だ! ホントに?
43.
キャッシュならではの改善策 43
44.
改善策のおさらい • 事前に複数のデータを結合すると – 実行回数:1回 –
転送量:n * (顧客のサイズ+都道府県のサイズ) 44 顧客ID 名前 都道府県ID 1 AAA 1 2 BBB 1 3 CCC 2 都道府県ID 名前 1 XXX 1 XXX 2 YYY n行
45.
改善策のおさらい 45 ん? 都道府県の情報って重複してない? 顧客ID 名前 都道府県ID 1
AAA 1 2 BBB 1 3 CCC 2 都道府県ID 名前 1 XXX 1 XXX 2 YYY n行
46.
ベストは? • でも、ベストなのは 重複無く顧客情報と都道府県情報を取ってくる 46 顧客ID 名前
都道府県ID 1 AAA 1 2 BBB 1 3 CCC 2 都道府県ID 名前 1 XXX 2 YYYn行 m行
47.
47 そんなに都合良くいくのか?
48.
キャッシュならではの改善策 • 関係へのアクセスは主キーによるアクセスのため Entityキャッシュを参照する • JPAでは事前に結合しなくてもn+1より良い –
最大SQL実行回数:m+1回 • ( n > 47 >= m なのでn+1より少ない) – 最大データサイズ:n * 顧客のサイズ + m * 都道府県のサイズ • 全てキャッシュされていれば – SQL実行回数:1回 – データサイズ:n * 顧客のサイズ 48 ↑で満足してはダメ ←これを目指します
49.
シーケンス -1回目の実行 49 顧客ID 名前
都道府県ID 1 AAA 1 2 BBB 1 3 CCC 2 DB SELECT * FROM 顧客 SELECT * FROM 都道府県 WHERE 都道府県ID = 1 都道府県ID 名前 2 YYY 都道府県ID 名前 1 XXX findAll() JPA 1 2 3 .get居住地() 1 .get居住地() 1 .get居住地() 2 1 2 SELECT * FROM 都道府県 WHERE 都道府県ID = 2 キャッシュされる キャッシュされたEntityを返す 1 2 3 主キーアクセスでは無いデータは、 キャッシュしない設定にするのもあり
50.
シーケンス -2回目の実行 50 顧客ID 名前
都道府県ID 1 AAA 1 2 BBB 1 3 CCC 2 DB SELECT * FROM 顧客findAll() JPA 1 2 3 .get居住地() 1 .get居住地() 1 .get居住地() 2 1 2 1回目でキャッシュされている 1 2 3 DBへのアクセスは1回になって 処理時間が短くなった!!
51.
コラム –Lazy/Eager Joinとの違い- •
キャッシュすることと、Lazy/Eager Joinは別物になります。 • Lazy Joinは関連先のEntityを使用するときに、関連先のデータを新 たに問い合わせます。 • Eager Joinは問合せ時に、関連先のデータをさらに新たに問い合わ せてEntityを構築しておき、使用時に新たな問合せをしません。 • Eager/Lazy Joinで、新たに問い合わせる際に、キャッシュされてい ればキャッシュを使用し、キャッシュされていなければDBに問い合 わせます。 • Lazy/Eager Joinは新たに問い合わせるタイミングが異なるだけです。 51 実装系やバージョンにより、動作が異なる可能性があります
52.
キャッシュチューニング 52
53.
何をどのように検討するか 53 何をどのように検討すれば良いのだろう・・・?
54.
チューニング事項 • ウォーミングアップ – 処理を受け付ける前に、必要なデータを全てを読み込んで キャッシュさせる •
データ毎にキャッシュ数を検討する • データ特性に合わせた参照を検討する 54 まず考えるのはこの3つ
55.
データの特性に合わせたキャッシュ設計 • キャッシュ数 – デフォルトは100個入るList構造を作成する –
適切な数にしないと、無駄なヒープを消費することもある • 参照方法 – デフォルトはSoft参照のため、ヒープが足りなくなると削除さ れる。 – 強参照(FULL)にすると常にキャッシュし続ける 55
56.
データの特性に合わせたキャッシュ設計例 • 都道府県情報 – 全てキャッシュしておくならFULLで47個にする •
郵便番号 – 7桁なので最大10,000,000個の可能性がある – メモリに余裕があれば、ヒープサイズを大きくして全てキャッ シュするのもアリ。 – メモリに余裕が無ければ、全てキャッシュすることは現実的で は無い。ホットデータだけをキャッシュする 56 53個分すら勿体ない
57.
まとめ 57
58.
まとめ • JPAはJavaの標準規格 • キャッシュを使うとシステム全体の負荷を減らせる •
アプリの処理時間が短くなる • Entityオブジェクトを保持するため常にメモリは使う • 使われないデータをキャッシュしても無駄なので、なん でもキャッシュすれば良い訳ではない。 • データ特性に合わせたキャッシュ設計が重要 58
59.
FIN. 59
Download