Go语言sync.Pool深度解析:临时对象复用与高效缓存处理
发表时间: 2024-06-02 16:16
这一节主要讲解sync.Pool基本使用方法
Pool 是一个可以重用临时对象的池。它主要用于缓存和重用临时对象,以减少内存分配和垃圾回收的开销。但是,需要注意的是,sync.Pool 并不保证对象一定可用,也不保证对象一定会被重用。简单示例代码:
// 创建一个 sync.Pool 对象 pool := sync.Pool{ New: func() interface{} { return new(int) }, } // 从 pool 中获取对象 obj := pool.Get().(*int) fmt.Println("从 pool 中获取的对象:", *obj) // 将对象放回 pool 中 *obj = 42 pool.Put(obj) // 再次从 pool 中获取对象 obj2 := pool.Get().(*int) fmt.Println("再次从 pool 中获取的对象:", *obj2)
案例:使用goLang是实现一个数据库连接池
func main() { connectPool := NewConnectPool("root", "123456", "192.168.19.100", "szkfpt", 3306) connect := connectPool.Pool.Get().(*sql.DB) // 把连接放回去 defer connectPool.Pool.Put(connect) stat := connect.Stats() fmt.Println("获取到连接", stat)}type ConnectPool struct { Pool *sync.Pool}func NewConnectPool(userName, password, host, dataBaseName string, port int) *ConnectPool { return &ConnectPool{ Pool: &sync.Pool{ New: func() interface{} { db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", userName, password, host, port, dataBaseName)) if err != nil { panic(err) } return db }, }, }}
在实际生产环境中,大家是怎么创建数据库线程池呢?一起讨论下吧