java 释放连接池连接_redigo连接池 - 为什么在删除过时连接时释放锁定

Redigo是redis数据库的golang客户端 . 它使用struct Pool 来维护连接池 . 此结构为应用程序放置和获取并行连接保存了一个互斥锁 .

type Pool struct {

// ...

IdleTimeout time.Duration

mu sync.Mutex

// Stack of idleConn with most recently used at the front.

idle list.List

}

在其 get 方法中,连接池首先删除过时(空闲超时)连接 . 当找到陈旧的连接时,池会弹出它,释放锁定,然后关闭连接,再次尝试获取锁定 .

func (p *Pool) get() (Conn, error) {

p.mu.Lock()

// Prune stale connections.

if timeout := p.IdleTimeout; timeout > 0 {

for i, n := 0, p.idle.Len(); i < n; i++ {

e := p.idle.Back()

if e == nil {

break

}

ic := e.Value.(idleConn)

if ic.t.Add(timeout).After(nowFunc()) {

break

}

p.idle.Remove(e)

p.release()

// Why does pool unlock and try to acquire lock again?

p.mu.Unlock()

// Close this stale connection.

ic.c.Close()

p.mu.Lock()

}

}

为什么池解锁并尝试再次获取锁定,而不是在函数返回之前解锁?我想关闭一个连接可能会耗费相当多的时间,这将减慢其他goroutine等待这个互斥锁 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值