Contenu connexe
Similaire à Database sql (20)
Database sql
- 6. ソースも見てみよう
type DB struct {
driver driver.Driver
dsn string
numClosed uint64
mu sync.Mutex
freeConn []*driverConn
connRequests []chan connRequest
numOpen int
// (後略)
}
- 7. ソースも見てみよう(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
// (略)
}
- 8. ソースも見てみよう(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
}
- 11. 接続数の制限
func(*DB) SetMaxIdleConns
func (db *DB) SetMaxIdleConns(n int)
空きコネクションの最大数を指定。0だとコネクションプーリング
を行わない
func(*DB) SetMaxOpenConns
func (db *DB) SetMaxOpenConns(n int)
(空きも含めた)全コネクションの最大数。0だと上限なし
最大値しか設定できない。しばらく経つと、最大数に張り付いたままに
なる