golang实现基于通道的通用连接池详解

  

  

golang的频道除了goroutine通信之外还有很多其他的功能,本文将实现一种基于通道的通用连接池。下面话不多说了,来一起看看详细的介绍吧。

  

  

*连接池中连接类型{}为接口,使得更加通用

  

*链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题

  

*使用通道处理池中的链接,高效

  


  

  

连接池的实现不依赖具体的实例,而依赖某个接口,本文的连接池选用的是io。近接口,只要是实现了该接口的对象都可以被池管理。
  

  

当然,你可以实现基于界面{}的连接池,这样任何对象都可以被管理。

  


  

  

将连接句柄存入通道中,由于缓存通道的特性,获取连接时如果池中有连接,将直接返回,如果池中没有连接,将阻塞或者新建连接(没超过最大限制的情况下)。
  

  

由于面向接口编程,所有创建连接的逻辑是不清楚的,这里需要传入一个函数,该函数返回一个io.Closer对象。

  


  

  

由于并发问题,在需要操作池中互斥数据的时候需要加锁。

        包池   导入(   “错误”   “输入输出”   “同步”   “时间”   )      var (   ErrInvalidConfig=错误。新(“无效池配置”)   ErrPoolClosed=错误。新(“池封闭”)   )      (io类型工厂func ()。近,错误)      池接口类型{   获得()(io。近,错误)//获取资源   释放(io.Closer)错误//释放资源   关上(io.Closer)错误//关闭资源   Shutdown()错误//关闭池   }      GenericPool struct类型{   sync.Mutex   池陈io.Closer   maxOpen int//池中最大资源数   numOpen int//当前池中资源数   minOpen int//池中最少资源数   关闭bool//池是否已关闭   maxLifetime time.Duration   工厂工厂//创建连接的方法   }      func NewGenericPool (minOpen maxOpen int, maxLifetime时间。持续时间、工厂工厂)(* GenericPool,错误){   如果maxOpen & lt;=0 | | minOpen祝辞maxOpen {   返回nil, ErrInvalidConfig   }   p:=, GenericPool {   maxOpen: maxOpen,   minOpen: minOpen,   maxLifetime: maxLifetime,   工厂:工厂,   池:使(陈io。近,maxOpen),   }      我:=0;我& lt;minOpen;我+ + {   近,犯错:=工厂()   如果犯错!=nil {   继续   }   p.numOpen + +   p。池& lt; -接近   }   返回p,零   }      func (p * GenericPool)获得()(io。近,错误){   如果p。关闭{   返回nil, ErrPoolClosed   }   为{   近,犯错:=p.getOrCreate ()   如果犯错!=nil {   返回nil,犯错   }//todo maxLifttime处理   返回,零   }   }      func (p * GenericPool) getOrCreate () (io。近,错误){   选择{   例近:=& lt; -p.pool:   返回,零   默认值:   }   p.Lock ()   如果p。numOpen祝辞=p。maxOpen {   近:=& lt; -p.pool   p.Unlock ()   返回,零   }//新建连接   近,犯错:=p.factory ()   如果犯错!=nil {   p.Unlock ()   返回nil,犯错   }   p.numOpen + +   p.Unlock ()   返回,零   }//释放单个资源到连接池   func (p * GenericPool)释放(io.Closer)错误{   如果p。关闭{   返回ErrPoolClosed   }   p.Lock ()   p。池& lt; -接近   p.Unlock ()   返回nil   }//关闭单个资源   func (p * GenericPool)关闭(io.Closer)错误{   p.Lock ()   closer.Close ()   p.numOpen——   p.Unlock ()   返回nil   }//关闭连接池,释放所有资源   func (p * GenericPool)关闭错误(){   如果p。关闭{   返回ErrPoolClosed   }   p.Lock ()   关上(p.pool)   近:=p。池{   closer.Close ()   p.numOpen——   }   p。关闭=true   p.Unlock ()   返回nil   }      


  

  

基于该连接池,可以管理所有io.Closer对象。比如memcached,复述等等,非常方便!

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

golang实现基于通道的通用连接池详解