SlideShare una empresa de Scribd logo
1 de 16
Descargar para leer sin conexión
database/sqlとコネクション
Talos208
TL;DR
database/sqlには意図した使用法がある
database/sqlにはDBとの接続数を設定するAPIがいくつかある
ライブラリのソースも読んでみよう
WhoamI
株式会社スプラウトR&D TechLead
組込み→Windowsゲーム→SIer(Web系BtoB)→セキュリティと流
れてきたので、無駄に色々できる
Twitter : Talos208
GitHub: https://github.com/Talos208
database/sql
go標準のSQLライブラリ
使用法
db, err := sql.Open("driver name", "dsn")
if err != nil {
return nil, err
}
rows, err := db.Query(...)
db.Close()
……ってしたくなりますよね?
Db.Close()のドキュメント
こんな記述が……
It is raretoCloseaDB , as theDB handleis meant tobelong‑
livedandsharedbetweenmany goroutines.
訳)
DBをCloseすることは、ほとんどない。なぜなら、DBハンドルは長期間
生存して複数のgoroutine間で共有することを意図しているから。
ソースも見てみよう
type DB struct {
driver driver.Driver
dsn string
numClosed uint64
mu sync.Mutex
freeConn []*driverConn
connRequests []chan connRequest
numOpen int
// (後略)
}
ソースも見てみよう(2)
func (db *DB) conn(strategy connReuseStrategy)
(*driverConn, error) {
// (略)
numFree := len(db.freeConn)
if strategy == cachedOrNewConn && numFree > 0 {
conn := db.freeConn[0]
copy(db.freeConn, db.freeConn[1:])
db.freeConn = db.freeConn[:numFree-1]
conn.inUse = true
// (略)
return conn, nil // freeConnの先頭を再利用
}
// (略)
db.numOpen++ // optimistically
db.mu.Unlock()
ci, err := db.driver.Open(db.dsn) // ここでOpen
// (略)
}
ソースも見てみよう(3)
func (db *DB) Close() error {
// (略)
var err error
fns := make([]func() error, 0, len(db.freeConn))
for _, dc := range db.freeConn {
fns = append(fns, dc.closeDBLocked())
}
db.freeConn = nil
// (略)
for _, fn := range fns {
err1 := fn()
if err1 != nil {
err = err1
}
}
return err
}
ソースから読み取れたこと
 sql.Open() で返ってくるDB構造体は、コネクションプールを持
っている
接続をするときには、まずプールの空きコネクションを使用する
 DB.Exec() / DB.Query() などから自動的に DB.conn() が呼
ばれる。あれば空きコネクションが利用され、無ければ新規コ
ネクションが取得される
 DB.Close() は、全ての空きコネクションを切断する
つまり
都度Open()/Close()すると、その度にコネクション接続/切断のコス
トがかかる
DBへのログインのコストもかかる
並行して複数のDB構造体を持つと、余計なメモリを消費する
これを避けるために
 sql.Open() は起動時に1回だけ呼ぶ
 DB.Close() は最後に1回呼ぶ
接続数の制限
func(*DB) SetMaxIdleConns
 func (db *DB) SetMaxIdleConns(n int) 
空きコネクションの最大数を指定。0だとコネクションプーリング
を行わない
func(*DB) SetMaxOpenConns
 func (db *DB) SetMaxOpenConns(n int) 
(空きも含めた)全コネクションの最大数。0だと上限なし
最大値しか設定できない。しばらく経つと、最大数に張り付いたままに
なる
What happen?
症状
sql.Open()は出来る
DB.Ping()も成功する
DB.Query()を実行するとコネクションエラー
????
Condition
サーバとDBとの間に、MariDB Maxscaleを使用していた
Maxscale
MySQL(MariaDB)向けのL7ロードバランサ
クエリ内容を見て SELECT はリードレプリカに、 UPDATE はマ
スターにとか出来る
Cause
1. サーバ<‑> Maxscaleのコネクションは存在
Maxscaleとはつながるので、DB.Ping()は成功
2. Maxscale<‑> MySQLの接続がタイムアウトしていた
サーバにタイムアウトが通知されない
3. クエリ発行時にコネクションエラー
じつはMaxscaleがエラーを出していた
SetConnMaxLifetime()
Go1.6から新しいAPIが導入された
func(*DB) SetConnMaxLifetime
 func (db *DB) SetConnMaxLifetime(d time.Duration) 
一定時間以上経った接続は再利用しない
これを使うだけのためにGo1.4‑>Go1.6に移行
解決
1.  SetConnMaxLifetime() の設定により、サーバ<‑> Maxscale間
のコネクションのほうが先に切れる
2. DB.Ping()の時点で、コネクションが再接続される
3. 正常にクエリ発行

Más contenido relacionado

La actualidad más candente

Bat jscrpt powershell
Bat jscrpt powershellBat jscrpt powershell
Bat jscrpt powershellNaoyuki Sano
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサーnakamura001
 
カウチなやつら CouchDB in the room
カウチなやつら CouchDB in the roomカウチなやつら CouchDB in the room
カウチなやつら CouchDB in the roomMakoto Ohnami
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャDADA246
 
Drawing Dataflow On Dalvik Bytecodes
Drawing Dataflow On Dalvik Bytecodes Drawing Dataflow On Dalvik Bytecodes
Drawing Dataflow On Dalvik Bytecodes Takahiro Yoshimura
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Shinsuke Sugaya
 
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発Shinsuke Sugaya
 

La actualidad más candente (8)

Bat jscrpt powershell
Bat jscrpt powershellBat jscrpt powershell
Bat jscrpt powershell
 
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー第3回Webkit/HTML5勉強会 - File APIと加速度センサー
第3回Webkit/HTML5勉強会 - File APIと加速度センサー
 
カウチなやつら CouchDB in the room
カウチなやつら CouchDB in the roomカウチなやつら CouchDB in the room
カウチなやつら CouchDB in the room
 
高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ高度に最適化された移植可能なメモリマネージャ
高度に最適化された移植可能なメモリマネージャ
 
Drawing Dataflow On Dalvik Bytecodes
Drawing Dataflow On Dalvik Bytecodes Drawing Dataflow On Dalvik Bytecodes
Drawing Dataflow On Dalvik Bytecodes
 
Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道Fess/Elasticsearchを使った業務で使える?全文検索への道
Fess/Elasticsearchを使った業務で使える?全文検索への道
 
Distributed processwithapex&amp;flow lowcode
Distributed processwithapex&amp;flow lowcodeDistributed processwithapex&amp;flow lowcode
Distributed processwithapex&amp;flow lowcode
 
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
 

Destacado

【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料Yuji Otani
 
フォントとカーネル Vmのあやしい関係
フォントとカーネル Vmのあやしい関係フォントとカーネル Vmのあやしい関係
フォントとカーネル Vmのあやしい関係明 高橋
 
Go言語でのステート管理
Go言語でのステート管理Go言語でのステート管理
Go言語でのステート管理明 高橋
 
Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8明 高橋
 
Baremetal rust for_windows
Baremetal rust for_windowsBaremetal rust for_windows
Baremetal rust for_windows明 高橋
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Yuji Otani
 
Introduction to Go programming
Introduction to Go programmingIntroduction to Go programming
Introduction to Go programmingExotel
 
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装Yusei Yamanaka
 
Reflectionのパフォーマンス
ReflectionのパフォーマンスReflectionのパフォーマンス
Reflectionのパフォーマンス明 高橋
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangYoshiki Shibukawa
 
猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座Yusei Yamanaka
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Corporation
 

Destacado (14)

【初心者向け】Go言語勉強会資料
 【初心者向け】Go言語勉強会資料 【初心者向け】Go言語勉強会資料
【初心者向け】Go言語勉強会資料
 
フォントとカーネル Vmのあやしい関係
フォントとカーネル Vmのあやしい関係フォントとカーネル Vmのあやしい関係
フォントとカーネル Vmのあやしい関係
 
TalknoteとGolang
TalknoteとGolangTalknoteとGolang
TalknoteとGolang
 
Go言語でのステート管理
Go言語でのステート管理Go言語でのステート管理
Go言語でのステート管理
 
Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8
 
Baremetal rust for_windows
Baremetal rust for_windowsBaremetal rust for_windows
Baremetal rust for_windows
 
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
 
Introduction to Go programming
Introduction to Go programmingIntroduction to Go programming
Introduction to Go programming
 
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
FPGAを用いたシリアル入力型VGA映像出力装置の設計と実装
 
Reflectionのパフォーマンス
ReflectionのパフォーマンスReflectionのパフォーマンス
Reflectionのパフォーマンス
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolang
 
猫にはわからないGit講座
猫にはわからないGit講座猫にはわからないGit講座
猫にはわからないGit講座
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法LINE Ads PlatformのCTRを2倍にした開発手法
LINE Ads PlatformのCTRを2倍にした開発手法
 

Similar a Database sql

Web技術勉強会 第25回
Web技術勉強会 第25回Web技術勉強会 第25回
Web技術勉強会 第25回龍一 田中
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
Mongo db勉強会
Mongo db勉強会Mongo db勉強会
Mongo db勉強会otmb
 
MariaDB 10.3 概要
MariaDB 10.3 概要 MariaDB 10.3 概要
MariaDB 10.3 概要 GOTO Satoru
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - Tetsutaro Watanabe
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1Makoto Haruyama
 
社会ネットワーク分析第7回
社会ネットワーク分析第7回社会ネットワーク分析第7回
社会ネットワーク分析第7回Satoru Mikami
 
S2dao Seminar in tripodworks
S2dao Seminar in tripodworksS2dao Seminar in tripodworks
S2dao Seminar in tripodworkstripodworks
 
Asakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for HadoopAsakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for HadoopTakashi Kambayashi
 
Introducing Spider 20101206(DTT#7)
Introducing Spider 20101206(DTT#7)Introducing Spider 20101206(DTT#7)
Introducing Spider 20101206(DTT#7)Kentoku
 
オライリーセミナー Hive入門 #oreilly0724
オライリーセミナー Hive入門  #oreilly0724オライリーセミナー Hive入門  #oreilly0724
オライリーセミナー Hive入門 #oreilly0724Cloudera Japan
 
Spider DeNA Technology Seminar #2
Spider DeNA Technology Seminar #2Spider DeNA Technology Seminar #2
Spider DeNA Technology Seminar #2Kentoku
 
超簡単!Subversion入門 準備編
超簡単!Subversion入門 準備編超簡単!Subversion入門 準備編
超簡単!Subversion入門 準備編Shin Tanigawa
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境yut148atgmaildotcom
 

Similar a Database sql (20)

Web技術勉強会 第25回
Web技術勉強会 第25回Web技術勉強会 第25回
Web技術勉強会 第25回
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
MongoDB
MongoDBMongoDB
MongoDB
 
Mongo db勉強会
Mongo db勉強会Mongo db勉強会
Mongo db勉強会
 
Azure Datalake 大全
Azure Datalake 大全Azure Datalake 大全
Azure Datalake 大全
 
MariaDB 10.3 概要
MariaDB 10.3 概要 MariaDB 10.3 概要
MariaDB 10.3 概要
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
 
Hachioji.pm11
Hachioji.pm11Hachioji.pm11
Hachioji.pm11
 
My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1My sql casual_in_fukuoka_vol1
My sql casual_in_fukuoka_vol1
 
社会ネットワーク分析第7回
社会ネットワーク分析第7回社会ネットワーク分析第7回
社会ネットワーク分析第7回
 
S2dao Seminar in tripodworks
S2dao Seminar in tripodworksS2dao Seminar in tripodworks
S2dao Seminar in tripodworks
 
Dexiejs
DexiejsDexiejs
Dexiejs
 
Asakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for HadoopAsakusa Enterprise Batch Processing Framework for Hadoop
Asakusa Enterprise Batch Processing Framework for Hadoop
 
Introducing Spider 20101206(DTT#7)
Introducing Spider 20101206(DTT#7)Introducing Spider 20101206(DTT#7)
Introducing Spider 20101206(DTT#7)
 
オライリーセミナー Hive入門 #oreilly0724
オライリーセミナー Hive入門  #oreilly0724オライリーセミナー Hive入門  #oreilly0724
オライリーセミナー Hive入門 #oreilly0724
 
Spider DeNA Technology Seminar #2
Spider DeNA Technology Seminar #2Spider DeNA Technology Seminar #2
Spider DeNA Technology Seminar #2
 
超簡単!Subversion入門 準備編
超簡単!Subversion入門 準備編超簡単!Subversion入門 準備編
超簡単!Subversion入門 準備編
 
Inside of Asakusa DSL
Inside of Asakusa DSLInside of Asakusa DSL
Inside of Asakusa DSL
 
Level dbを試した
Level dbを試したLevel dbを試した
Level dbを試した
 
配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境配布用Beginnerならきっと役立つmaster slave環境
配布用Beginnerならきっと役立つmaster slave環境
 

Database sql