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
470
プールにゆこう
関ジャバ'24 3月度
https://kanjava.connpass.com/event/311167/
3月後半でもう春だよなぁプール開きだよなぁと思ってたんだけど、当日クソ寒かった。
irof
March 25, 2024
Tweet
Share
More Decks by irof
See All by irof
型で語るカタ
irof
0
710
つよそうにふるまい、つよい成果を出すのなら、つよいのかもしれない
irof
1
310
複数アプリケーションを育てていくための共通化戦略
irof
10
4.4k
SpringBootにおけるオブザーバビリティのなにか
irof
1
1k
Javaアプリケーションモニタリングの基本
irof
7
2.7k
Webアプリケーションを作りましょう
irof
0
140
Javaの新しめの機能を知ったかぶれるようになる話 #kanjava
irof
3
6.3k
バッチを作らなきゃとなったときに考えること
irof
2
790
SpringBoot3.4の構造化ログ #kanjava
irof
3
1.4k
Other Decks in Programming
See All in Programming
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
1k
dbt民主化とLLMによる開発ブースト ~ AI Readyな分析サイクルを目指して ~
yoshyum
3
1.1k
ご注文の差分はこちらですか? 〜 AWS CDK のいろいろな差分検出と安全なデプロイ
konokenj
4
590
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
mickey_kubo
1
240
状態遷移図を書こう / Sequence Chart vs State Diagram
orgachem
PRO
2
210
はじめてのWeb API体験 ー 飲食店検索アプリを作ろうー
akinko_0915
0
140
Goで作る、開発・CI環境
sin392
0
260
Porting a visionOS App to Android XR
akkeylab
0
690
AI Agent 時代のソフトウェア開発を支える AWS Cloud Development Kit (CDK)
konokenj
6
810
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
5
8.7k
Claude Code + Container Use と Cursor で作る ローカル並列開発環境のススメ / ccc local dev
kaelaela
12
7.1k
Agentic Coding: The Future of Software Development with Agents
mitsuhiko
0
130
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1031
460k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
990
Producing Creativity
orderedlist
PRO
346
40k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
47
9.6k
Docker and Python
trallard
45
3.5k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Raft: Consensus for Rubyists
vanstee
140
7k
Designing for humans not robots
tammielis
253
25k
Why Our Code Smells
bkeepers
PRO
337
57k
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