database/sqlの仕組みについて¶
チェック¶
- [ ] 本文を確認した
- [ ] 概要を確認した
- [ ] タグを確認した
- [ ]
inbox/直下へ移行した
概要¶
Go 標準の database/sql が、SQL driver を抽象化し、goroutine safe な connection pool を提供する仕組みを解説する資料。
sql.Open、blank import、driver registration、PingContext、DB.conn、freeConn、connRequests などの内部処理が扱われる。
ORM も database/sql と driver をラップして拡張している、という位置づけがわかる。
本文¶
database/sql は Go が提供する DB 操作用の標準 package。
MySQL や PostgreSQL の実装そのものは持たず、SQL driver が interface を満たすことで利用できる。
実際の利用では database/sql と任意の SQL driver を組み合わせる。
blank import は package の副作用、つまり init を実行するために使われる。
MySQL driver は init で sql.Register("mysql", &MySQLDriver{}) を呼び、driver を登録する。
同じ name で二重登録すると panic する。
sql.Open(driverName, dataSourceName) は、登録済み driver を探し、driver.DriverContext を満たしていれば connector を作り、OpenDB へ進む。
sql.Open は実接続を保証するものではないため、実際に接続確認したい場合は PingContext を呼ぶ。
sql.DB は単一 connection ではなく、0 個以上の underlying connections を表す handle。
複数 goroutine から安全に使える。
この性質により、HTTP request ごとの goroutine が同じ *sql.DB を共有しても、connection pool の管理は database/sql 側が担う。
connection pool には、idle connection を保持する freeConn、空きがないときの待ち行列 connRequests、cleaner 用の channel などが登場する。
Exec、Query、Ping、Tx、Prepare は内部で connection を取得し、処理後に release する。
要点¶
database/sqlは DB 実装ではなく driver abstraction と pool 管理を提供する。- SQL driver は blank import による
initでsql.Registerされる。 sql.Openだけでは接続確認にならず、PingContextが必要。*sql.DBは goroutine safe な connection pool handle として共有する。