golang中怎么利用channel 实现一个连接池
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家介绍golang中怎么利用channel 实现一个连接池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。何为通用?连接池的实现不依赖具体的实例,而依赖某个接口,本文的
千家信息网最后更新 2026年11月02日golang中怎么利用channel 实现一个连接池
这篇文章给大家介绍golang中怎么利用channel 实现一个连接池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
何为通用?
连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用的是io.Closer接口,只要是实现了该接口的对象都可以被池管理。
当然,你可以实现基于interface{}的连接池,这样任何对象都可以被管理。
实现原理
将连接句柄存入channel中,由于缓存channel的特性,获取连接时如果池中有连接,将直接返回,如果池中没有连接,将阻塞或者新建连接(没超过最大限制的情况下)。
由于面向接口编程,所有创建连接的逻辑是不清楚的,这里需要传入一个函数,该函数返回一个io.Closer对象。
实现
由于并发问题,在需要操作池中互斥数据的时候需要加锁。
package pool
import (
"errors"
"io"
"sync"
"time"
)
var (
ErrInvalidConfig = errors.New("invalid pool config")
ErrPoolClosed = errors.New("pool closed")
)
type factory func() (io.Closer, error)
type Pool interface {
Acquire() (io.Closer, error) // 获取资源
Release(io.Closer) error // 释放资源
Close(io.Closer) error // 关闭资源
Shutdown() error // 关闭池
}
type GenericPool struct {
sync.Mutex
pool chan io.Closer
maxOpen int // 池中最大资源数
numOpen int // 当前池中资源数
minOpen int // 池中最少资源数
closed bool // 池是否已关闭
maxLifetime time.Duration
factory factory // 创建连接的方法
}
func NewGenericPool(minOpen, maxOpen int, maxLifetime time.Duration, factory factory) (*GenericPool, error) {
if maxOpen <= 0 || minOpen > maxOpen {
return nil, ErrInvalidConfig
}
p := &GenericPool{
maxOpen: maxOpen,
minOpen: minOpen,
maxLifetime: maxLifetime,
factory: factory,
pool: make(chan io.Closer, maxOpen),
}
for i := 0; i < minOpen; i++ {
closer, err := factory()
if err != nil {
continue
}
p.numOpen++
p.pool <- closer
}
return p, nil
}
func (p *GenericPool) Acquire() (io.Closer, error) {
if p.closed {
return nil, ErrPoolClosed
}
for {
closer, err := p.getOrCreate()
if err != nil {
return nil, err
}
// todo maxLifttime处理
return closer, nil
}
}
func (p *GenericPool) getOrCreate() (io.Closer, error) {
select {
case closer := <-p.pool:
return closer, nil
default:
}
p.Lock()
if p.numOpen >= p.maxOpen {
closer := <-p.pool
p.Unlock()
return closer, nil
}
// 新建连接
closer, err := p.factory()
if err != nil {
p.Unlock()
return nil, err
}
p.numOpen++
p.Unlock()
return closer, nil
}
// 释放单个资源到连接池
func (p *GenericPool) Release(closer io.Closer) error {
if p.closed {
return ErrPoolClosed
}
p.Lock()
p.pool <- closer
p.Unlock()
return nil
}
// 关闭单个资源
func (p *GenericPool) Close(closer io.Closer) error {
p.Lock()
closer.Close()
p.numOpen--
p.Unlock()
return nil
}
// 关闭连接池,释放所有资源
func (p *GenericPool) Shutdown() error {
if p.closed {
return ErrPoolClosed
}
p.Lock()
close(p.pool)
for closer := range p.pool {
closer.Close()
p.numOpen--
}
p.closed = true
p.Unlock()
return nil
}关于golang中怎么利用channel 实现一个连接池就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
资源
接口
对象
最大
内容
函数
单个
更多
帮助
管理
不错
清楚
兴趣
前池
原理
句柄
实例
小伙
小伙伴
情况
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
手磨咖啡
科技和互联网公司
厦门中拓互联网络科技有限公司
圆梦互联网科技
互联网科技金融公司
礼当家互联网科技
奇酷互联网科技公司
奇酷互联网络科技
互联网科技生活的内容
哈尔滨秒房互联网科技有限公司
字节跳动和互联网科技
荆州市昕露互联网络科技有限公司
未来五年的互联网科技
启辰互联网科技
35岁以上互联网科技行业
广州燕处互联网科技有限公司
抖集互联网科技技术咨询
深圳互联网科技园地址
上海互联网科技园景观
承德科技产业互联网平台
互联网科技有限公司
美国互联网保险保险科技
互联网是不是新科技
朗新科技与工业互联网
上海挚品互联网科技
互联网科技公司介绍
互联网科技类展会
央行互联网金融科技公司
恒生互联网科技业指数调整周期
湖北辰鑫科技互联网