Go语言 连接池相关总结:HTTP、RPC、Redis 和数据库等( 七 )

连接池维护的逻辑和其它库差不多 。与其它库不同的是,该库会保证 idle 的 conns 维持在 MinIdleConn 配置数量之上,不足的话,会在后台补充:
func (p *ConnPool) checkMinIdleConns() { if p.opt.MinIdleConns == 0 {  return } for p.poolSize < p.opt.PoolSize && p.idleConnsLen < p.opt.MinIdleConns {  p.poolSize++  p.idleConnsLen++  go func() {   err := p.addIdleConn()   if err != nil {    p.connsMu.Lock()    p.poolSize--    p.idleConnsLen--    p.connsMu.Unlock()   }  }() }}database/sql这里的连接池与 RPC 系列的稍有区别,取的是 freeConns 的第一个,并且有一个可能效率比较低的 copy 过程:
 // Prefer a free connection, if possible. 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  db.mu.Unlock()  if conn.expired(lifetime) {   conn.Close()   return nil, driver.ErrBadConn  }  // Lock around reading lastErr to ensure the session resetter finished.  conn.Lock()  err := conn.lastErr  conn.Unlock()  if err == driver.ErrBadConn {   conn.Close()   return nil, driver.ErrBadConn  }  return conn, nil 其它的没啥特殊的 。




推荐阅读