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
GormをVersionUpしたお話
Search
Fumiya Suzuki
November 13, 2021
Programming
1.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GormをVersionUpしたお話
GormをVersionUpした際の苦労とご褒美のお話です
Fumiya Suzuki
November 13, 2021
Other Decks in Programming
See All in Programming
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
240
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
320
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
440
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
200
Creating Composable Callables in Contemporary C++
rollbear
0
210
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
300
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
1B+ /day規模のログを管理する技術
broadleaf
0
140
関数型プログラミングのメリットって何だろう?
wanko_it
0
170
Performance Engineering for Everyone
elenatanasoiu
0
270
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
130
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
220
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.4k
How STYLIGHT went responsive
nonsquared
100
6.2k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.8k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
330
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Designing Experiences People Love
moore
143
24k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
340
30 Presentation Tips
portentint
PRO
1
350
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Transcript
GORMのVersionを上げたお話 Go Conference 2021 Autumn Fumiya Suzuki @sntree_suzunoki
GORM • GoのORMで一番スター数が多く、 一番機能が多い • 直感的にクエリを書くことができて、 初心者でもわかりやすい • 内部ではreflectを用いて対象の structを認識するので、コード生成を
必要としない • 2020/08にv2がリリースされた
V2 Release Note • V2はスクラッチで書き直された • 欲しかった機能がたくさん追加されて いる! • パフォーマンスも向上したみた
い!!!
よーしお兄さんパフォーマンスあげちゃうぞ
こんなはずじゃなかった...
苦労したポイント The Gopher character is based on the Go mascot
designed by Renée French .
とにかく修正量が多い • 微妙にクエリが変わるため、GORMを使用している全ての箇所で発行されるクエリ を確認する必要がある • 引数の型が変更されたり、エラーの判別方法が変更されているのでこれも修正して 回る必要がある • go-sqlmock等で用意しているモックはほぼ全てに修正が必要になる •
タグのタイポなどでサラッとミスしてエラーが出ないので、単体テストがない場合は 書いていかないと動作を保証しづらい
無限のクエリでmapが膨れ上がる • Prepareされた結果やコネクションの情報はクエリをkeyにしてGORM内部のmap に保存される • 二回目以降はそのマップからの情報を利用して、二度目のPrepareをしない Prepare map[string]gorm.Stmt Excute map[string]gorm.Stmt
Excute 解析結果
無限のクエリでmapが膨れ上がる • このmapは上限もなくevictionされることがないため、fmt.Sprintfなどで動的にクエ リを構築などをしているとマップが膨れ上がる • また、DBのキャッシュできるStatementの最大数に達してしまい、新たにPrepareで きなくなる • 動的に構築している部分を書き直していき、複雑すぎるところはそこだけ PrepareStatementModeを利用しないようにした
Prepare map[string]gorm.Stmt Excute 解析結果 解析結果 解析結果 解析結果 ・ ・ ・ ・ ・ ・
既存の実装に悩まされる • 自由、便利、なんとなく動く ◦ 同じクエリに対して何通りも書き方があるので、人によって書き方が全然違う ◦ 同じモデルを色々なところで使いまわしているため修正の影響範囲が大きすぎる ◦ Selectを指定していないのでいらない項目を大量に取っていた ◦
タグをタイポしていてもcolumnの順番で奇跡的に取れていた The Gopher character is based on the Go mascot designed by Renée French . これ全部同じことやっているのかぁ
ご褒美 The Gopher character is based on the Go mascot
designed by Renée French .
ご褒美 35% 取得遅延が 35%削減されました
ご褒美 • ちょっと安心安全 ◦ 全件削除されなくなった ◦ 実行時エラーが少なくなった ◦ 変な使い方がやりづらくなった •
パフォーマンス向上 ◦ PreparedStatementのサポート ◦ allocationが少なくなっている • 欲しかった機能が追加された ◦ contextのサポート ◦ バッチインサート ◦ 複数データベースや ReadWriteの分離の公式サポート • 今ここでLTしている
まとめ • GORMのV2の内容はとても良いので、バージョンはあげるべき • しかし、時間がかかると想定しておくと吉 • GORMとの付き合い方を考えるきっかけとなる • パフォーマンスは改善されるのでやるととっても気持ちいい