Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プールにゆこう
Search
irof
March 25, 2024
Programming
2
480
プールにゆこう
関ジャバ'24 3月度
https://kanjava.connpass.com/event/311167/
3月後半でもう春だよなぁプール開きだよなぁと思ってたんだけど、当日クソ寒かった。
irof
March 25, 2024
Tweet
Share
More Decks by irof
See All by irof
型で語るカタ
irof
2
1.2k
つよそうにふるまい、つよい成果を出すのなら、つよいのかもしれない
irof
1
340
複数アプリケーションを育てていくための共通化戦略
irof
10
4.7k
SpringBootにおけるオブザーバビリティのなにか
irof
1
1.1k
Javaアプリケーションモニタリングの基本
irof
7
2.7k
Webアプリケーションを作りましょう
irof
0
190
Javaの新しめの機能を知ったかぶれるようになる話 #kanjava
irof
3
6.4k
バッチを作らなきゃとなったときに考えること
irof
2
820
SpringBoot3.4の構造化ログ #kanjava
irof
3
1.5k
Other Decks in Programming
See All in Programming
未来を拓くAI技術〜エージェント開発とAI駆動開発〜
leveragestech
2
190
サイトを作ったらNFCタグキーホルダーを爆速で作れ!
yuukis
0
690
MLH State of the League: 2026 Season
theycallmeswift
0
170
Understanding Ruby Grammar Through Conflicts
yui_knk
1
140
エンジニアのための”最低限いい感じ”デザイン入門
shunshobon
0
130
Flutter로 Gemini와 MCP를 활용한 Agentic App 만들기 - 박제창 2025 I/O Extended Seoul
itsmedreamwalker
0
160
A Gopher's Guide to Vibe Coding
danicat
0
180
testingを眺める
matumoto
1
120
ワープロって実は計算機で
pepepper
2
1.4k
フロントエンドのmonorepo化と責務分離のリアーキテクト
kajitack
2
150
もうちょっといいRubyプロファイラを作りたい (2025)
osyoyu
0
170
UbieのAIパートナーを支えるコンテキストエンジニアリング実践
syucream
2
770
Featured
See All Featured
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
Six Lessons from altMBA
skipperchong
28
4k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
GitHub's CSS Performance
jonrohan
1032
460k
Designing Experiences People Love
moore
142
24k
Making Projects Easy
brettharned
117
6.3k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
KATA
mclloyd
32
14k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
How STYLIGHT went responsive
nonsquared
100
5.8k
Rails Girls Zürich Keynote
gr2m
95
14k
Transcript
ϓʔϧʹΏ͜͏ ؔδϟό'24 3݄ @irof h t t ps://irof.me
ϓʔϧ • ͳʹ͔ΛཷΊ͓ͯ͘ͷ • JavaͷੈքͰʮͳʹ͔ʯʹʮΦϒδΣΫτʯ • ͭ·ΓʮϓʔϧʯʹΦϒδΣΫτϓʔϧ • ཷΊͯɺ͑ΔΑ͏ʹ͍ͯ͠Δঢ়ଶ •
ϓʔϧͱ͍͏໊લʮཷΊΔʯʹओ؟͕͋Γͦ͏͕ͩɺ͏ͨΊʹཷΊΔΜͩΑͶͱ • ͳͷͰʮཷΊΔʯͦͷΑ͏ʹݟ͍͑ͯΕɺ࣮ࡍཷ·͍ͬͯͳͯ͘Α͍
ཷΊΔཧ༝ • ͏࣌ʹ࡞ΔͷͰෆ߹͕͋Δ • CPUϝϞϦΛ͏ • ͕͔͔࣌ؒΔ • ... •
ཧ͍ͨ͠ • : ଟ͗ͯ͢ࠔΔͷͱ͔ • ...
ࠓ͢ϓʔϧͨͪ
ίωΫγϣϯϓʔϧ
ίωΫγϣϯϓʔϧɺͨͱ͑ɻ • σʔλϕʔείωΫγϣϯϓʔϧ • : σʔλϕʔεͱͷଓʹ͕͔͔࣌ؒΔ • ௨৴ͷཱ֬ɺೝূɺ΄͔ • :
σʔλϕʔε͕ड͚ೖΕΒΕΔଓʹݶΓ͕͋Δ • σʔλϕʔεαʔόʔͷϦιʔεΛফඅ͢Δ • దʹղ์͠ͳ͍ͱ͍͚ͳ͍
😕
None
☺
• ࠓ͜ͷ͘Β͍ͷղ૾Ͱ͢ɻ
σʔλϕʔείωΫγϣϯϓʔϧΛ͏͜ͱͰ • ίωΫγϣϯΛ͍͍ͨͱ͖ʹίωΫγϣ ϯϓʔϧ͔ΒआΓͯ͘ΔͷͰɺଓ࣌ͷί ετΛલ͍Ͱ͖Δ • ʮΓͳ͍࣌ʹ৽ͨʹଓ͢Δʯͱ͔ ͢ΔͷͰɺৗʹલ͍͢ΔͱݶΒͳ͍ • ෳͷΫϥΠΞϯτͰίωΫγϣϯΛڞ༗
Ͱ͖Δ • ʮ100ΫϥΠΞϯτ͋Δ͔Β100ίωΫ γϣϯཁΔʯͱ͔Ͱͳ͍ • ίωΫγϣϯͷཧΛͤΒΕΔ
ίωΫγϣϯϓʔϧଞʹ • RDBͷίωΫγϣϯϓʔϧʢjavax.sql.DataSourceʣ͕Α͘ݟΔίωΫγϣϯϓʔϧͩ ͕ɺଞͷίωΫγϣϯΛϓʔϧ͢Δͷ͋Δɻͨͱ͑HTTP ClientͷίωΫγϣ ϯɻ • ୯Ұαʔόʔʹશ෦٧Ίࠐ·ͣʹωοτϫʔΫΛհͯ͠৭ʑ͢ΔͷͰɺ͋ͪͪ͜Ͱʮί ωΫγϣϯʯΛѻ͏ɻίωΫγϣϯߴίετͳͷͰɺϓʔϧ͢ΔՁ͕͋Δɻ •
ίωΫγϣϯͷͳʹ͕ߴίετ͔ʁׂѪɻ • ࣗͰ։͍ͨίωΫγϣϯΛ͏߹ͱɺϓʔϧ͞Ε͍ͯΔίωΫγϣϯΛ͏߹Ͱ ΤϥʔϋϯυϦϯάʢϦτϥΠϙϦγʔͱ͔ʣ͕ҟͳΔͱ͔ѻ͏ɻ
εϨουϓʔϧ
εϨουϓʔϧɺͨͱ͑ɻ • ϫʔΧʔεϨουϓʔϧ • ϦΫΤετΛεϨουͰࡹ͘ΞϓϦέʔγϣϯͰग़ͯ͘Δ • : εϨουͷੜʹ࣌ؒίετ͔͔Δ • :
ͨΓʹεϨουΛੜ͢ΔͱJVMͷϦιʔεΛ৯͍௵͢ • : εϨου༻࣌ʹ͏ଆ͕ҙࣝͨ͘͠ͳ͍ܾ·Γࣄ͕͋Γ͕ͪ
None
😖
None
😎
😀
ϫʔΧʔεϨουϓʔϧΛ͏͜ͱͰ • ෳͷϦΫΤετΛಉ࣌ʹࡹ͚ΔΑ͏ ʹͳΔ • Ϣʔβʔ͕1ਓͰҰʹ1ϦΫΤετ͠ ͔͛ͳ͍ͳΒશવཁΒͳ͍ • ͳΒWebΞϓϦʹ͢Δҙຯͳ͍ •
ͷΜͿΖ͖ͬΜ͙ͱ͔͍ͬͯಉ͡Ͱ ͢ɻ͏εϨου֨ஈʹҧ͏͚Ͳɻ
εϨουϓʔϧଞʹ • @AsyncͰΘΕΔඇಉظλεΫεϨου • @ScheduledͰΘΕΔεέδϡʔϥʔεϨου • ͦͷଞҙͷεϨου • εϨουΛ͏࣌εϨουϓʔϧΛ͏ •
java.util.concurrent.ExecutorService εϨουϓʔϧͱࢥͬͯྑ͍ • ݱɺϓϩμΫτͰnew Thread()͢Δ͜ͱͳ͍
ͦͷଞͷϓʔϧɺͨͱ͑ɻ • DIίϯςφ • ʮDIίϯςφʯͨ·ʹʹͳΔ͠Ԍ্͢Δ͚ͲɺಛఆίϯςΩετʹ͓͚ΔΠϯ ελϯεͷੜํ๏Λड͚͍࣋ͬͯΔɻ • : ΠϯελϯεԽʹίετ͕͔͔Δ •
ʮDBίωΫγϣϯʯΠϯελϯε • : ΠϯελϯεΛ࡞ΔͨΊͷύϥϝλ͕ࢄΔͱࠔΔ
ϓʔϧશൠʹݴ͑Δ͜ͱ • ͩͨ͠ΒͲ͢👶 • ͍ऴΘͬͨΒඞͣϓʔϧʹ͢ • ϓʔϧϓʔϧରͷϥΠϑαΠΫϧΛཧ͢Δͷ͕ϑΝΫτϦͳͲͱҧ͏ͱ͜Ζ • ͠ΕͨΓ͢Δͱϓʔϧ͙͢Γͳ͘ͳΔ •
Θ͔ΔΑ͏ʹ͓ͯ͘͠ • ೖ͍ͬͯΔͷͷʢՄมͷͷಛʹʣ
εϨουϓʔϧͰͱ͘ʹ͓͖͍ͬͯͨ͜ͱ • Θ͔ΔΑ͏ʹ͓ͯ͘͠ • ԿݸͷεϨου͕͋Δ͔ • ԿݸͷεϨου͕͍ͯ͘͠͠Δ͔ • Կ݅ͷλεΫ͕ͪड͚த͔ •
ҟৗ࣌Λߟྀ͓ͯ͘͠ • εϨου͕ࢮΜͩΒͲ͏ͳΔ͔ • JVM͕ࢮΜͩ࣌ʹॲཧதͪड͚தͷ͕Ͳ͏ͳΔ͔
ͨͱ͑ɺJDKͰͨ·ʹ͋Γ·͢ • java.net.http.HttpClientͰίωΫγϣ ϯΛϓʔϧʹฦ͠ΕΔͬͯόά • 11.0.8ҎલͬͯΔͱى͜Δ
WEBΞϓϦʹ͓͚Δ ϓʔϧͷαΠζ
None
WEBΞϓϦͱϓʔϧ • ϓʔϧͳ͠ͷੈքɺͭ·ΓΫϥΠΞϯτ͔ ΒϦΫΤετΛ͏͚͔ͯΒશ෦Δੈք؍ ͋Δ • ͕ɺJavaͳWebΞϓϦͦΜͳੈք؍Ͱ ͳ͍ • JavaͳWebΞϓϦ͍ΖΜͳϓʔϧΛ४උ
͔ͯ͠ΒʮΑͬ͠Ό͜ʔ͍ʯͬͯΓ·͢ • Javaͷʢىಈ͕ʣ͍ͱ͔ݴΘΕΔҰҼ • ىಈ࣌ͷΫϥεಡΈࠐΈClassLoaderͬͯ ϓʔϧʹΫϥεใΛ٧ΊࠐΜͰΔͱݴ͑Δ
ແݶʹ༻ҙ͓͚͍͍ͯ͠ͱ͍͏ͷͰͳ͍ • Ϧιʔε͍ͭͩͬͯ༗ݶɻΫϥΠΞϯτͱͯ͠ͷίωΫγϣϯϓʔϧαʔόʔଆ͕ड͚ೖΕΒΕΔݶ ͕͋Δ͠ɺ1ϓʔϧͰ༗͍͍ͯ͠ʹݶ͕͋ΔɻεϨουJVMͷதͷ͚ͩͲɺεϨουΛ࡞Δ͝ ͱʹϝϞϦΛ͏͔ΒɺͦΕΛߟྀͨ͠ϝϞϦઃఆ͕ඞཁɻ • ͨ͘͞ΜͷͷͷॳظԽΛʮલआΓʯ͢Δͱɺવͦͷ͚ͩىಈ͕͘ͳΔɻ • ඞཁͳ͚ͩΛ֬อͯ͠͠Ύͬͱىಈͯ͠΄͍͠ɻ •
༻ҙͨ͠ͷͷϥΠϑαΠΫϧཧ͕͍Δ • ίωΫγϣϯϓʔϧʮଓ͕༗ޮ͔ʯͷ֬ೝ͕͍Δɻஅ͞ΕͨίωΫγϣϯΛͨ͠ΒʮίωΫ γϣϯϓʔϧΛೖΕͨΒ͏·͘௨৴Ͱ͖ͳ͍͜ͱ͕૿͑ͨʂʯͱ͔ͳΓ·͢ͷͰɻϋεΩʔϐϯάΛ ͢ΔεϨου͕८ճͯͬͨ͠Γ͢ΔͷͰɺ͕ଟ͍ͱͦΕ͚ͩෛ୲ʹͳΔɻ • ͜ΕΒͷαΠζͦΕͳΓʹؔ࿈͕͋ͬͨΓͳ͔ͬͨΓʢͬͯΛ࣍ʹ͠·͢ʣ
ϓʔϧͷσϑΥϧταΠζ • SpringBootͷ߹ • TomcatͷϫʔΧʔεϨου: 200 • HikariCPͷίωΫγϣϯϓʔϧ: 10 •
10ͬͯগͳ͍ʁͱࢥ͏ํHikariCPͷ WikiʹσϑΥϧτ10ͱͯ͠Δཧ༝આ໌ ͯ͠Δ͔ΒɺҰݟ·͠ΐ͏ɻ
αΠζͷؔ࿈ • ϫʔΧʔεϨουϓʔϧͱίωΫγϣϯϓʔϧͷΛฒ͍ͯΔͷɺগͳ͘ͱ ϫʔΧʔεϨουΑΓଟ͘ͷίωΫγϣϯΛอ͍࣋ͯͯ͠·ͣΘΕͳ͍͔Βɻ • ΞϓϦͷ࡞ΓʹΑͬͯΘΕΔ • ͲΜͳ࡞Γͨ͠ΒʮϫʔΧʔεϨουҎ্ͷίωΫγϣϯΛ͏͔ʯ͓ͬͯ͘ ͱྑ͍
ڞ༗σʔλϕʔεͱσʔλϕʔείωΫγϣϯϓʔϧ
୯ҰΞϓϦέʔγϣϯͰαʔόʔෳ͕͋ͨΓ·͑ • ΞϓϦέʔγϣϯαʔόʔ͕ϦΫΤετΛ ·͕ͨͬͨঢ়ଶΛ࣋ͭͱʮͳΜͰͦΜͳ࡞ ΓʹͳͬͯΔΜͩʁʯͱݴΘΕ͔Ͷͳ͍ɻ • ίϯςφͷޙԡ͋ͬͯ͠ɺΞϓϦέʔ γϣϯαʔόʔͷΑΓՄมʹͳ͍ͬͯ Δɻ •
ੲͷ͏ɺҰ߸ػɺೋ߸ػͱ͍͏;͏ ʹαʔόʔΛݺΜͰ͍ͨΜ͡Ό👴 • ແఀࢭσϓϩΠͱ͔͢Δͱ͞Βʹഒʹ ͳͬͨΓ͢ΔɻΠϯϓϨʔεͳϩʔϦϯά Ͱ࠷1૿͑Δɻ
ڞ༗σʔλϕʔεͰͷίωΫγϣϯࢉ • ಄ͷਤɻ2ΞϓϦέʔγϣϯͰ20ʁ • ΞϓϦ͝ͱʹ10ଓɺͦΕ͕2Πϯελϯ εɻ͜͜ʹσϓϩΠ͕ॏͳͬͨΒ2ഒɻͦΕ ͕2ΞϓϦͳͷͰɺMAX80ʹͳΔɻ • 80͘Β͍ͳΒʹͳΒͳ͍͚Ͳɺ1ΞϓϦέʔ γϣϯ͋ͨΓͷσʔλϕʔείωΫγϣϯϓʔ
ϧ͕10ͰΓΔઃܭ͕Ͱ͖͍ͯΔ͔ʹ͔͔Δɻ Ͱ͖͍ͯͳ͍ͳΒ૿͟͞ΔΛಘͳ͍ɻ • 1ΞϓϦ100ʹͨ͠Β800ͩͶ⭐ • ڞ༗σʔλϕʔεͳઃܭΛ͢Δੈք؍Ͱɺ2Ξ ϓϦͳΜ͔Ͱޮ͔ͳ͍Ͱ͠ΐ͏ɻ
ॳظαΠζͷ • ϫʔΧʔεϨουʢTomcatʣ • Initial: 10, Max: 200 • ίωΫγϣϯϓʔϧʢHikariCPʣ
• Initial: 10, Max: 10 • ϓʔϧ͢Δͷίετ͕ߴ͍ɻ֬อ ͓ͯ͘͠ʁ΄Μͱʁ֦ு͢ΔͳΒɺͦ ͷίετΛ୭ʹෛΘͤΔʁϋζϨҾ͍ ͨϢʔβʁʁ
͓·͚
None
None