SlideShare a Scribd company logo
1 of 36
Download to read offline
伊藤ちひろ
Chihiro Ito
最新のJavaで使える
最先端のデータベース監視
Advanced Database Monitoring in Modern Java
1
Source:
Insert source data here
Insert source data here
Insert source data here
OPTIONAL SECTION MARKER OR TITLE
伊藤ちひろ (Chihiro Ito)
OpenJDK Committer (JFR, SA)
Middleware Solution Architect @ Red Hat
Twitter : @chiroito
自己紹介
Profile
2
本資料の対象者
Target of this presentation
● Java を使って開発している人
Java Developer
● Data Store を使ったシステムを開発してる人
Deveroper using Data Stores in system
● Java か Data Store で性能問題が起きてる気がする人
People guessing performance problems in Java or Data Store
● Data Store で起きてる問題の根拠を出せなくて調査できない人
People who can't provide evidence of the problems happening in the Data Store
3
システムの構成要素
Compornents of System
アプリケーション
Application
データストア
Data Store
問い合せ
Query
* Query Language
Put/Get
4
よくある問題
A common problem
アプリ開発者
Application Developer
データストア管理者
Data Store Administrator
このクエリが遅いと思うから
DB側で調べてくれよ
I expect this query to be slow, so
the DBA should look into it.
統計情報を見ても遅延なんて
出ていないからアプリが原因だろ
I haven't seen any delays in the
stats, so it's probably the app.
5
私たちに必要なもの
What we need
6
適切な証拠
Appropriate Evidence
この状況で問題が
発生するのか!
This system have
problems in this
situation!
アプリケーション
Application
出力
Output
Data Store管理者
Data Store Administrator
!
適切な証拠を集めるのは非常に困難
It's very difficult to collect appropriate evidence
println
println
実行計画
Execution
plan
どこだ・・・
Where's...
どのクエリだ・・・
Which query...
7
アプリケーション
Application
データストア
Data Store
こうしませんか?
How about this approach?
● 事前に全ての問題が特定できるなら、事前に解決できる
If you can identify all the problems in advance, you can solve them in advance
● 問題発生時に予想で問題箇所を絞り込んでいくのは止める
Don't use predictions to narrow down the problem areas when they occur.
● 仕組みを導入して、問題は確実に対応できるようにする
Put a mechanism in place to ensure that problems are addressed.
8
私たちが望む姿
What we want
問題のある箇所の可視化
Visualization of problem areas
問題が起きたら通知
Notify when there's a problem
9
どうすれば良いの?
What should I do?
Jfr4Jdbc
JDK Flight Recorder
10
and
JDK Flight Recorder (JFR) とは
What’s JDK Flight Recorder (JFR)
● OpenJDK 11から使えるプロファイリングツール
Profiling tools available from OpenJDK 11
● 小さいオーバーヘッドでJVM内のイベントを記録
Record the event in the JVM with a small overhead
● ダンプしてJDK Mission Controlで見たり、イベントを処理をする
Dumping and viewing in JDK Mission Control and handling events
11
Jfr4Jdbc とは
What’s Jfr4Jdbc?
● 他のJDBCドライバをラップする JDBC ドライバ
JDBC driver to wrap other JDBC drivers
● JDBC のメソッド呼び出しにあわせてイベントを JFR に記録
Recording events to JFR as JDBC methods are called
○ 接続、問い合せ、コミット、ロールバックなど
Connections, inquiries, commits, rollbacks, etc.
12
JFR周辺の全体像
Overview of the JFR area
Jfr4Jdbc
JFR
JMC
イベント処理
Event Processing
ダンプファイル
Dump File
リポジトリ
Repository
13
設定
Settings
JFRのはじめかた
How to get started with JFR
● VMの起動オプション
JVM Options
● 外部ツール(JMC/JMX/JCMD)
External Tools
● API
○ JFR API
○ JFR Event Streaming API (Java 14)
14
起動オプションと外部からの起動とダンプ
Start JFR from JVM options or external tool, and dump from external tool
● VMの起動オプション
JVM Options
java -XX:StartFlightRecording=name=<name>,dumponexit=true,filename=dump.jfr Main
jcmd <PID> JFR.dump name=<name> filename=dump.jfr
jcmd <PID> JFR.stop name=<name> filename=dump.jfr
● 外部ツールからの起動
Launching from an external tool
15
jcmd <PID> JFR.start name=<name> dumponexit=true filename=dump.jfr
● 外部ツールからのダンプと停止
Dummping and stopping from an external tool
APIによるJFRの記録の開始とダンプ
API to start recording and dumping JFR
try(Recording recording = new Recording()) {
recording.enable(JfrConnectionEvent.class);
// 様々な設定をする Various settings.
recording.start();
// なにかイベントを発する処理をする Process to emit some events.
Path dumpFilePath = Files.createFile(Paths.get("dump.jfr")).toRealPath();
recording.dump(dumpFilePath);
recording.stop();
catch(Exception e) {}
16
APIによるJFRの記録の開始とイベント処理
API to initiate JFR recording and event processing
Configuration config = Configuration.getConfiguration("default");
try (EventStream es = new RecordingStream(config)) {
es.onEvent("dev.jfr4jdbc.event.jfr.JfrStatementEvent", System.out::println);
// 処理したい内容を追加 Add what you want to process
es.startAsync();
// なにかイベントを発する処理をする Process to emit some events.
} catch (Exception e) {
}
17
Jfr4Jdbcのはじめ方
How to get started with Jfr4Jdbc
DataSource ds = new Jfr4JdbcDataSource(db.getDataSource());
Connection con = ds.getConnection(); // instance of JfrConneciton
PreparedStatement stmt = con.prepareStatement(sql); // instance of JfrPreparedStatement
● URLにjfr:を追加する (例:jdbc:jfr:postgresql://host:port/db)
Add jfr: to the URL
● JDBC の各インスタンスをラップする
Wrapping each instance of JDBC
○ そのインスタンスから生成される他のインスタンスはラップ済
Other instances created from that instance are already wrapped
18
実例1Example 1
19
質問:どこに問題があるか?
Question: where is the problem?
DataSource ds = ・・・
try (Connection con = ds.getConnection()) {
// 何かしらの処理をする Do something
PreparedStatement stmt = con.prepareStatement("SELECT 1 FROM dual");
stmt.executeQuery();
} catch (SQLException e) {
// ちゃんとした例外処理 Appropriate exception handling
}
20
答え:コネクションの割り当てに問題
Answer: connection allocation is the problem
DataSource ds = ・・・
try (Connection con = ds.getConnection()) {
// 何かしらの処理をする Do something
PreparedStatement stmt = con.prepareStatement("SELECT 1 FROM dual");
stmt.executeQuery();
} catch (SQLException e) {
// ちゃんとした例外処理 Appropriate exception handling
}
21
理由:接続数が不足していた
Reason: There were not enough connections
アプリケーション
Application
データストア
Data Store
>
受付けるスレッド数
Number of
acceptable threads
用意してる接続数
Number of available
connections
22
コネクションの割り当て待ちの全体像
The overall picture of waiting for connections to be assigned
23
割り当て待ち
waiting for assignment
問い合せ時間
Query time
あるコネクションに絞った JFR
JFR focused on one connection
24
問い合せ中
querying in progress
割り当て待ち
waiting for assignment
課題と改善
Issues and Improvements
● 割り当てに時間が掛かると想定してない
No one expects it to take a long time to assign
● この問題は負荷試験をしないと発現することはない
The problem won't appear until you do a load test
● プールするコネクション数を増やして改善
Improve it by increasing the number of connections to pool
25
改善して割り当て待ちが無くなった
Improvements and no longer waiting for assignments
26
実例2Example 2
27
質問:どこに問題があるか?
Question: where is the problem?
DataSource ds = ・・・
try (Connection con = ds.getConnection()) {
// 何かしらの処理をする Do something
PreparedStatement stmt = con.prepareStatement("SELECT * FROM t WHERE pref = ?");
stmt.setString(0, getPref());
stmt.executeQuery();
} catch (SQLException e) {
// ちゃんとした例外処理 Appropriate exception handling
}
28
答え:パラメータの値に問題
Answer: the value of the parameter matters
DataSource ds = ・・・
try (Connection con = ds.getConnection()) {
// 何かしらの処理をする Do something
PreparedStatement stmt = con.prepareStatement("SELECT * FROM t WHERE pref = ?");
stmt.setString(0, getPref());
stmt.executeQuery();
} catch (SQLException e) {
// ちゃんとした例外処理 Appropriate exception handling
}
29
理由:あるパラメータでは実行計画が不適切
Reason: improper execution plan for some parameters
アプリケーション
Application
データストア
Data Store
30
Tokyo
Shimane
Tottori
特定のパラメータでは遅い
Slow on some parameters
たまに時間が長い問い合せがある
Sometimes there are queries that take a long time
31
たまに問い合せが遅い
Sometimes the queries are slow
時間の長い問い合せを確認する
Check out the time-consuming queries
32
パラメータがTokyoのクエリだけ
querys with only Tokyo parameter
遅い順に並び替え
Sorted in slow order
課題と改善
Issues and Improvements
● パラメータによって発生する問題の再現は難しい
It's hard to see the problems caused by the parameters
● データストアの実装およびデータ量によって異なる
Depends on the implementation of the data store and the amount of data
● 最適な実行計画が使われるように問い合せる
Query the best execution plan to be used
33
長い処理時間が消えた
The long processing time is gone
34
まとめ
Conclusion
● 問題発生時に予想で問題箇所を絞り込んでいくのは止める
Don't use predictions to narrow down the problem areas when they occur.
● 仕組みを導入して、問題は確実に対応できるようにする
Put a mechanism in place to ensure that problems are addressed.
● JFR と Jfr4Jdbc を使えば、問題を漏れなく確認できる
Using JFR and Jfr4Jdbc, you can check for problems without missing a beat
● やることは依存性を足して URL に jfr: を追加するだけ。
All you have to do is add dependencies and add jfr: to the URL
35
CONFIDENTIAL Designator
linkedin.com/company/red-hat
youtube.com/user/RedHatVideos
facebook.com/redhatinc
twitter.com/RedHat
Thank you
36

More Related Content

What's hot

JavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpJavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpYuji Kubota
 
Java Flight Recorderの紹介 at Java Day Tokyo 2015
Java Flight Recorderの紹介  at Java Day Tokyo 2015Java Flight Recorderの紹介  at Java Day Tokyo 2015
Java Flight Recorderの紹介 at Java Day Tokyo 2015Chihiro Ito
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」Hiroyuki Ohnaka
 
Head toward Java 15 and Java 16
Head toward Java 15 and Java 16Head toward Java 15 and Java 16
Head toward Java 15 and Java 16Yuji Kubota
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
Catch up Java 12 and Java 13
Catch up Java 12 and Java 13Catch up Java 12 and Java 13
Catch up Java 12 and Java 13Yuji Kubota
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTYuji Kubota
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsYoshimasa Tanabe
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjugYuji Kubota
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiNorito Agetsuma
 
Panamaを先取り!? JVMCIでJITと遊ぶ
Panamaを先取り!? JVMCIでJITと遊ぶPanamaを先取り!? JVMCIでJITと遊ぶ
Panamaを先取り!? JVMCIでJITと遊ぶYasumasa Suenaga
 
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellbitter_fox
 
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Norito Agetsuma
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!bitter_fox
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介khisano
 
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側賢 秋穂
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)Masatoshi Tada
 
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4bitter_fox
 

What's hot (20)

JavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jpJavaOne 2015 JDK Update (Jigsaw) #j1jp
JavaOne 2015 JDK Update (Jigsaw) #j1jp
 
Java Flight Recorderの紹介 at Java Day Tokyo 2015
Java Flight Recorderの紹介  at Java Day Tokyo 2015Java Flight Recorderの紹介  at Java Day Tokyo 2015
Java Flight Recorderの紹介 at Java Day Tokyo 2015
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
 
Head toward Java 15 and Java 16
Head toward Java 15 and Java 16Head toward Java 15 and Java 16
Head toward Java 15 and Java 16
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
Catch up Java 12 and Java 13
Catch up Java 12 and Java 13Catch up Java 12 and Java 13
Catch up Java 12 and Java 13
 
HeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LTHeapStats @ Seasar Conference 2015 LT
HeapStats @ Seasar Conference 2015 LT
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
 
Lt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdiLt agetsuma 拡大するcdi
Lt agetsuma 拡大するcdi
 
Panamaを先取り!? JVMCIでJITと遊ぶ
Panamaを先取り!? JVMCIでJITと遊ぶPanamaを先取り!? JVMCIでJITと遊ぶ
Panamaを先取り!? JVMCIでJITと遊ぶ
 
Introduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshellIntroduction to JShell #JavaDayTokyo #jdt_jshell
Introduction to JShell #JavaDayTokyo #jdt_jshell
 
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介Javaにおけるネイティブコード連携の各種手法の紹介
Javaにおけるネイティブコード連携の各種手法の紹介
 
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
 
はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)はまる!JPA(初学者向けライト版)
はまる!JPA(初学者向けライト版)
 
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
 

Similar to Advanced database monitoring in modern java

Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)Photon運営事務局
 
Serviceability Toolsの裏側
Serviceability Toolsの裏側Serviceability Toolsの裏側
Serviceability Toolsの裏側Yasumasa Suenaga
 
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...Insight Technology, Inc.
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
 
コンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのかコンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのかgree_tech
 
テスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ーテスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ーShuji Watanabe
 
大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EE大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EETaiichilow Nagase
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
JPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発TipsJPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発Tipsyuichi_kuwahara
 
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解GMO GlobalSign Holdings K.K.
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)JPCERT Coordination Center
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性JPCERT Coordination Center
 
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼンゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン光晶 上原
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングYosuke Mizutani
 
JMeter によるパフォーマンステスト指南
JMeter によるパフォーマンステスト指南JMeter によるパフォーマンステスト指南
JMeter によるパフォーマンステスト指南じゅん なかざ
 

Similar to Advanced database monitoring in modern java (20)

Heap statsfx analyzer
Heap statsfx analyzerHeap statsfx analyzer
Heap statsfx analyzer
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
【Photon勉強会】1時間でわかるプラグイン開発とその実際(2017/3/23講演)
 
Serviceability Toolsの裏側
Serviceability Toolsの裏側Serviceability Toolsの裏側
Serviceability Toolsの裏側
 
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
 
コンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのかコンテナ時代にインフラエンジニアは何をするのか
コンテナ時代にインフラエンジニアは何をするのか
 
テスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ーテスト駆動開発の導入ーペアプログラミングの学習効果ー
テスト駆動開発の導入ーペアプログラミングの学習効果ー
 
大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EE大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EE
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
JPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発TipsJPAの基礎と現場で役立つ開発Tips
JPAの基礎と現場で役立つ開発Tips
 
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
【Photon勉強会】FFGMでも採用!1時間でわかるPlugin開発とEnterprise Cloudの詳解
 
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
Apache CommonsのHttpClientに おけるSSLサーバ証明書検証不備 (CVE-2012-5783)
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
CruiseControl.NET設置
CruiseControl.NET設置CruiseControl.NET設置
CruiseControl.NET設置
 
MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性MySQL Connector/J における SQL インジェクションの脆弱性
MySQL Connector/J における SQL インジェクションの脆弱性
 
ゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼンゲーム開発プロセスカイゼン
ゲーム開発プロセスカイゼン
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
 
JMeter によるパフォーマンステスト指南
JMeter によるパフォーマンステスト指南JMeter によるパフォーマンステスト指南
JMeter によるパフォーマンステスト指南
 

More from Chihiro Ito

Red Hat Data Grid 8.2 新機能
Red Hat Data Grid 8.2 新機能Red Hat Data Grid 8.2 新機能
Red Hat Data Grid 8.2 新機能Chihiro Ito
 
Red Hat Data Grid 8.1 新機能
Red Hat Data Grid 8.1 新機能Red Hat Data Grid 8.1 新機能
Red Hat Data Grid 8.1 新機能Chihiro Ito
 
Quarkus Technical Deep Dive - Japanese
Quarkus Technical Deep Dive - JapaneseQuarkus Technical Deep Dive - Japanese
Quarkus Technical Deep Dive - JapaneseChihiro Ito
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方Chihiro Ito
 
Quarkusのビジネスと技術的な価値
Quarkusのビジネスと技術的な価値Quarkusのビジネスと技術的な価値
Quarkusのビジネスと技術的な価値Chihiro Ito
 
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発Chihiro Ito
 
Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Chihiro Ito
 
Getting started MySQL as Document Data Store
Getting started MySQL as Document Data StoreGetting started MySQL as Document Data Store
Getting started MySQL as Document Data StoreChihiro Ito
 
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかWebアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかChihiro Ito
 
JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法Chihiro Ito
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 

More from Chihiro Ito (12)

Red Hat Data Grid 8.2 新機能
Red Hat Data Grid 8.2 新機能Red Hat Data Grid 8.2 新機能
Red Hat Data Grid 8.2 新機能
 
Red Hat Data Grid 8.1 新機能
Red Hat Data Grid 8.1 新機能Red Hat Data Grid 8.1 新機能
Red Hat Data Grid 8.1 新機能
 
Quarkus Technical Deep Dive - Japanese
Quarkus Technical Deep Dive - JapaneseQuarkus Technical Deep Dive - Japanese
Quarkus Technical Deep Dive - Japanese
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方
 
Quarkusのビジネスと技術的な価値
Quarkusのビジネスと技術的な価値Quarkusのビジネスと技術的な価値
Quarkusのビジネスと技術的な価値
 
Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発Quarkus による超音速な Spring アプリケーション開発
Quarkus による超音速な Spring アプリケーション開発
 
Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要
 
Getting started MySQL as Document Data Store
Getting started MySQL as Document Data StoreGetting started MySQL as Document Data Store
Getting started MySQL as Document Data Store
 
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかWebアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
 
Hello Java
Hello JavaHello Java
Hello Java
 
JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法JPAのキャッシュを使ったアプリケーション高速化手法
JPAのキャッシュを使ったアプリケーション高速化手法
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 

Recently uploaded

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Recently uploaded (9)

モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

Advanced database monitoring in modern java

  • 2. Source: Insert source data here Insert source data here Insert source data here OPTIONAL SECTION MARKER OR TITLE 伊藤ちひろ (Chihiro Ito) OpenJDK Committer (JFR, SA) Middleware Solution Architect @ Red Hat Twitter : @chiroito 自己紹介 Profile 2
  • 3. 本資料の対象者 Target of this presentation ● Java を使って開発している人 Java Developer ● Data Store を使ったシステムを開発してる人 Deveroper using Data Stores in system ● Java か Data Store で性能問題が起きてる気がする人 People guessing performance problems in Java or Data Store ● Data Store で起きてる問題の根拠を出せなくて調査できない人 People who can't provide evidence of the problems happening in the Data Store 3
  • 5. よくある問題 A common problem アプリ開発者 Application Developer データストア管理者 Data Store Administrator このクエリが遅いと思うから DB側で調べてくれよ I expect this query to be slow, so the DBA should look into it. 統計情報を見ても遅延なんて 出ていないからアプリが原因だろ I haven't seen any delays in the stats, so it's probably the app. 5
  • 6. 私たちに必要なもの What we need 6 適切な証拠 Appropriate Evidence この状況で問題が 発生するのか! This system have problems in this situation! アプリケーション Application 出力 Output Data Store管理者 Data Store Administrator !
  • 7. 適切な証拠を集めるのは非常に困難 It's very difficult to collect appropriate evidence println println 実行計画 Execution plan どこだ・・・ Where's... どのクエリだ・・・ Which query... 7 アプリケーション Application データストア Data Store
  • 8. こうしませんか? How about this approach? ● 事前に全ての問題が特定できるなら、事前に解決できる If you can identify all the problems in advance, you can solve them in advance ● 問題発生時に予想で問題箇所を絞り込んでいくのは止める Don't use predictions to narrow down the problem areas when they occur. ● 仕組みを導入して、問題は確実に対応できるようにする Put a mechanism in place to ensure that problems are addressed. 8
  • 9. 私たちが望む姿 What we want 問題のある箇所の可視化 Visualization of problem areas 問題が起きたら通知 Notify when there's a problem 9
  • 10. どうすれば良いの? What should I do? Jfr4Jdbc JDK Flight Recorder 10 and
  • 11. JDK Flight Recorder (JFR) とは What’s JDK Flight Recorder (JFR) ● OpenJDK 11から使えるプロファイリングツール Profiling tools available from OpenJDK 11 ● 小さいオーバーヘッドでJVM内のイベントを記録 Record the event in the JVM with a small overhead ● ダンプしてJDK Mission Controlで見たり、イベントを処理をする Dumping and viewing in JDK Mission Control and handling events 11
  • 12. Jfr4Jdbc とは What’s Jfr4Jdbc? ● 他のJDBCドライバをラップする JDBC ドライバ JDBC driver to wrap other JDBC drivers ● JDBC のメソッド呼び出しにあわせてイベントを JFR に記録 Recording events to JFR as JDBC methods are called ○ 接続、問い合せ、コミット、ロールバックなど Connections, inquiries, commits, rollbacks, etc. 12
  • 13. JFR周辺の全体像 Overview of the JFR area Jfr4Jdbc JFR JMC イベント処理 Event Processing ダンプファイル Dump File リポジトリ Repository 13 設定 Settings
  • 14. JFRのはじめかた How to get started with JFR ● VMの起動オプション JVM Options ● 外部ツール(JMC/JMX/JCMD) External Tools ● API ○ JFR API ○ JFR Event Streaming API (Java 14) 14
  • 15. 起動オプションと外部からの起動とダンプ Start JFR from JVM options or external tool, and dump from external tool ● VMの起動オプション JVM Options java -XX:StartFlightRecording=name=<name>,dumponexit=true,filename=dump.jfr Main jcmd <PID> JFR.dump name=<name> filename=dump.jfr jcmd <PID> JFR.stop name=<name> filename=dump.jfr ● 外部ツールからの起動 Launching from an external tool 15 jcmd <PID> JFR.start name=<name> dumponexit=true filename=dump.jfr ● 外部ツールからのダンプと停止 Dummping and stopping from an external tool
  • 16. APIによるJFRの記録の開始とダンプ API to start recording and dumping JFR try(Recording recording = new Recording()) { recording.enable(JfrConnectionEvent.class); // 様々な設定をする Various settings. recording.start(); // なにかイベントを発する処理をする Process to emit some events. Path dumpFilePath = Files.createFile(Paths.get("dump.jfr")).toRealPath(); recording.dump(dumpFilePath); recording.stop(); catch(Exception e) {} 16
  • 17. APIによるJFRの記録の開始とイベント処理 API to initiate JFR recording and event processing Configuration config = Configuration.getConfiguration("default"); try (EventStream es = new RecordingStream(config)) { es.onEvent("dev.jfr4jdbc.event.jfr.JfrStatementEvent", System.out::println); // 処理したい内容を追加 Add what you want to process es.startAsync(); // なにかイベントを発する処理をする Process to emit some events. } catch (Exception e) { } 17
  • 18. Jfr4Jdbcのはじめ方 How to get started with Jfr4Jdbc DataSource ds = new Jfr4JdbcDataSource(db.getDataSource()); Connection con = ds.getConnection(); // instance of JfrConneciton PreparedStatement stmt = con.prepareStatement(sql); // instance of JfrPreparedStatement ● URLにjfr:を追加する (例:jdbc:jfr:postgresql://host:port/db) Add jfr: to the URL ● JDBC の各インスタンスをラップする Wrapping each instance of JDBC ○ そのインスタンスから生成される他のインスタンスはラップ済 Other instances created from that instance are already wrapped 18
  • 20. 質問:どこに問題があるか? Question: where is the problem? DataSource ds = ・・・ try (Connection con = ds.getConnection()) { // 何かしらの処理をする Do something PreparedStatement stmt = con.prepareStatement("SELECT 1 FROM dual"); stmt.executeQuery(); } catch (SQLException e) { // ちゃんとした例外処理 Appropriate exception handling } 20
  • 21. 答え:コネクションの割り当てに問題 Answer: connection allocation is the problem DataSource ds = ・・・ try (Connection con = ds.getConnection()) { // 何かしらの処理をする Do something PreparedStatement stmt = con.prepareStatement("SELECT 1 FROM dual"); stmt.executeQuery(); } catch (SQLException e) { // ちゃんとした例外処理 Appropriate exception handling } 21
  • 22. 理由:接続数が不足していた Reason: There were not enough connections アプリケーション Application データストア Data Store > 受付けるスレッド数 Number of acceptable threads 用意してる接続数 Number of available connections 22
  • 23. コネクションの割り当て待ちの全体像 The overall picture of waiting for connections to be assigned 23 割り当て待ち waiting for assignment 問い合せ時間 Query time
  • 24. あるコネクションに絞った JFR JFR focused on one connection 24 問い合せ中 querying in progress 割り当て待ち waiting for assignment
  • 25. 課題と改善 Issues and Improvements ● 割り当てに時間が掛かると想定してない No one expects it to take a long time to assign ● この問題は負荷試験をしないと発現することはない The problem won't appear until you do a load test ● プールするコネクション数を増やして改善 Improve it by increasing the number of connections to pool 25
  • 28. 質問:どこに問題があるか? Question: where is the problem? DataSource ds = ・・・ try (Connection con = ds.getConnection()) { // 何かしらの処理をする Do something PreparedStatement stmt = con.prepareStatement("SELECT * FROM t WHERE pref = ?"); stmt.setString(0, getPref()); stmt.executeQuery(); } catch (SQLException e) { // ちゃんとした例外処理 Appropriate exception handling } 28
  • 29. 答え:パラメータの値に問題 Answer: the value of the parameter matters DataSource ds = ・・・ try (Connection con = ds.getConnection()) { // 何かしらの処理をする Do something PreparedStatement stmt = con.prepareStatement("SELECT * FROM t WHERE pref = ?"); stmt.setString(0, getPref()); stmt.executeQuery(); } catch (SQLException e) { // ちゃんとした例外処理 Appropriate exception handling } 29
  • 30. 理由:あるパラメータでは実行計画が不適切 Reason: improper execution plan for some parameters アプリケーション Application データストア Data Store 30 Tokyo Shimane Tottori 特定のパラメータでは遅い Slow on some parameters
  • 31. たまに時間が長い問い合せがある Sometimes there are queries that take a long time 31 たまに問い合せが遅い Sometimes the queries are slow
  • 32. 時間の長い問い合せを確認する Check out the time-consuming queries 32 パラメータがTokyoのクエリだけ querys with only Tokyo parameter 遅い順に並び替え Sorted in slow order
  • 33. 課題と改善 Issues and Improvements ● パラメータによって発生する問題の再現は難しい It's hard to see the problems caused by the parameters ● データストアの実装およびデータ量によって異なる Depends on the implementation of the data store and the amount of data ● 最適な実行計画が使われるように問い合せる Query the best execution plan to be used 33
  • 35. まとめ Conclusion ● 問題発生時に予想で問題箇所を絞り込んでいくのは止める Don't use predictions to narrow down the problem areas when they occur. ● 仕組みを導入して、問題は確実に対応できるようにする Put a mechanism in place to ensure that problems are addressed. ● JFR と Jfr4Jdbc を使えば、問題を漏れなく確認できる Using JFR and Jfr4Jdbc, you can check for problems without missing a beat ● やることは依存性を足して URL に jfr: を追加するだけ。 All you have to do is add dependencies and add jfr: to the URL 35