Golang语言社区--Golang通用连接池

大家好,我是社区主编彬哥,本篇文章是给大家转载一篇关于连接池的文章。

连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrift-Clinet链接Service端使用的时候出现了并发问题,然后找到了一个通用的连接池的库在这里分享给大家.

附上:

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

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 总结

在使用过程中要是有任何问题都可以直接在文章下留言,希望这篇文章可以帮助大家解决眼前的问题,多谢大家的支持!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

原文链接:https://studygolang.com/articles/12551

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术分享

Intellij IDEA调试功能使用总结

这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此。 先编译好要调试的程序。 1.设置断点 ? 选定要设置断点的代码行,在行号的...

2019
来自专栏章鱼的慢慢技术路

Linux中几个与文档相关的命令

1673
来自专栏ytkah

laravel项目thinksns-plus安装出现RuntimeException Symlink from * to * failed错误

  今天ytkah安装thinksns-plus的laravel项目时出现了一个错误,提示如下,这个可能跟php函数被禁用有关,查看了一下安装文档,有一项php...

551
来自专栏Petrichor的专栏

Ubuntu输入密码后重返登录界面

进入了登录界面后,不用输入密码,按住 Ctrl+Alt+F1(F1~F6都行) 打开profile文件

1162
来自专栏小樱的经验随笔

代码审计:命令注入学习

0x01 起因及想法 起因:好久没更新博客了,我在乌云社区看到一篇代码审计的整体学习思想如下: 学习代码审计目标:能独立完成对一个CMS代码安全的监测 思路: ...

37410
来自专栏琦小虾的Binary

程序生成之编译、链接、加载浅析

程序生成之编译、链接、加载浅析 最近笔者看论文烦得慌,便又重新拾起之前没有完全完成的交叉编译,准备在网上找资料,好好研究一下。 讲道理,笔者其实对编译链接的...

2526
来自专栏Golang语言社区

Golang通用连接池

连接池在编程中并不少见,链接数据库,redis等操作都需要连接池,否则就会出现并发问题,如果每次操作都建立一条新的链接将会大大消耗资源,笔者也是在使用thrif...

1334
来自专栏破晓之歌

JS中各种对象数据的读写格式(含vue例子)待整理

1.Javascript 对象(object)合并:https://www.cnblogs.com/yes-V-can/p/5631645.html

611
来自专栏Linyb极客之路

linux常用基本命令之压缩解压缩命令

命令:gzip 语法:gzip [文件名称] 描述:压缩的时候不保留原文件,并且只能压缩文件不能压缩目录 命令:gunzip 语法:gunzip [已压缩的...

4535
来自专栏Java后端技术

关闭Eclipse的控制台console自动跳出

  但我们在做开发的时候,默认情况下eclipse的控制台如果有东西输出时,会默认由最小化跳出来,有时候会感觉很烦人,怎么解决这个问题呢?

903

扫码关注云+社区