[Golang软件推荐] Golang通用链接池

链接池在编程中并很多见,连接数据库,redis等操做都须要链接池,不然就会出现并发问题,若是每次操做都创建一条新的连接将会大大消耗资源,笔者也是在使用thrift-Clinet连接Service端使用的时候出现了并发问题,而后找到了一个通用的链接池的库在这里分享给你们.git

附上:github

喵了个咪的博客:w-blog.cn go-commons-pool-Github地址:github.com/jolestar/go-commons-poolredis

1.链接池

在使用以前咱们须要先了解清楚链接池的概念,总结下来链接池主要解决如下几类问题:数据库

  • 减小链接建立时间 与数据库仍是Thrift等程序创建链接都是有开销的。若是这类链接是“循环”使用的,使用该方式这些花销就可避免。
  • 简化的编程模式 当使用链接池时,具体的操做都是统一的不用关心初始化等各项关心点
  • 受控的资源使用 若是用户不使用链接池,而是每当须要时建立一个新的链接,那么用户的应用程序的资源使用会产生很是大的浪费而且可能会致使高负载下的异常发生。

2.go-commons-pool 使用

喵咪写了一个demo使用方式以下:编程

package main

import (
	"github.com/jolestar/go-commons-pool"
	"fmt"
	"time"
)

var pCommonPool *pool.ObjectPool

type PoolTest struct{}

func (this *PoolTest) Test() string {
	return "PoolTest"
}

func init() {
	// 初始化链接池配置项
	PoolConfig := pool.NewDefaultPoolConfig()
	// 链接池最大容量设置
	PoolConfig.MaxTotal = 1000
	WithAbandonedConfig := pool.NewDefaultAbandonedConfig()
	// 注册链接池初始化连接方式
	pCommonPool = pool.NewObjectPoolWithAbandonedConfig(pool.NewPooledObjectFactorySimple(
		func() (interface{}, error) {
			return Link()
		}), PoolConfig, WithAbandonedConfig)
}

// 初始化连接类
func Link() (*PoolTest, error) {
	fmt.Println("初始化PoolTest类!!!")
	return &PoolTest{}, nil
}

func main() {

	//----------------------------------第一次使用将会调用初始化方法---------------------------------
	fmt.Println("第一次使用将会调用初始化方法")
	Test()

	//----------------------------------第二次使用将会复用初始化好的对象---------------------------------
	fmt.Println("第二次使用将会复用初始化好的实例")
	Test()

	//----------------------------------连续屡次并发调用当链接池不够用的会扩充链接池---------------------------
	fmt.Println("连续屡次并发调用当链接池不够用的会扩充链接池")
	go Test()
	go Test()
	go Test()
	go Test()
	go Test()

	time.Sleep(1 * time.Second)
}

func Test() {
	var client *PoolTest
	// 从链接池中获取一个实例
	obj, _ := pCommonPool.BorrowObject()
	// 转换为对应实体
	if obj != nil {
		client = obj.(*PoolTest)
	}
	// 调用须要的方法
	fmt.Println(client.Test())
	// 交还链接池
	pCommonPool.ReturnObject(client)
}

输出以下:并发

第一次使用将会调用初始化方法
初始化PoolTest类!!!
PoolTest
第二次使用将会复用初始化好的实例
PoolTest
连续屡次并发调用当链接池不够用的会扩充链接池
PoolTest
初始化PoolTest类!!!
PoolTest
PoolTest
初始化PoolTest类!!!
PoolTest
PoolTest

3 总结

在使用过程当中要是有任何问题均可以直接在文章下留言,但愿这篇文章能够帮助你们解决眼前的问题,多谢你们的支持!this

注:笔者能力有限有说的不对的地方但愿你们可以指出,也但愿多多交流!code

相关文章
相关标签/搜索