2025-05-22 23:29:50 +08:00
|
|
|
|
package pool
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"errors"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-05-29 20:24:48 +08:00
|
|
|
|
var (
|
|
|
|
|
|
ErrPoolClosed = errors.New("pool is closed")
|
|
|
|
|
|
ErrNoAvailableConn = errors.New("no available connection")
|
|
|
|
|
|
)
|
2025-05-22 23:29:50 +08:00
|
|
|
|
|
|
|
|
|
|
// PoolConfig 连接池配置
|
2025-05-26 22:33:51 +08:00
|
|
|
|
type PoolConfig[T Conn] struct {
|
2025-05-22 23:29:50 +08:00
|
|
|
|
MaxConns int // 最大连接数
|
|
|
|
|
|
IdleTimeout time.Duration // 空闲连接超时时间
|
|
|
|
|
|
WaitTimeout time.Duration // 获取连接超时时间
|
|
|
|
|
|
HealthCheckInterval time.Duration // 健康检查间隔
|
|
|
|
|
|
OnPoolClose func() error // 连接池关闭时的回调
|
2025-05-26 22:33:51 +08:00
|
|
|
|
|
|
|
|
|
|
OnConnClose func(conn T) error // 连接关闭时的回调,若err != nil则不关闭连接
|
2025-05-22 23:29:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Option 函数类型,用于配置 Pool
|
2025-05-26 22:33:51 +08:00
|
|
|
|
type Option[T Conn] func(*PoolConfig[T])
|
2025-05-22 23:29:50 +08:00
|
|
|
|
|
|
|
|
|
|
// WithMaxConns 设置最大连接数
|
2025-05-26 22:33:51 +08:00
|
|
|
|
func WithMaxConns[T Conn](maxConns int) Option[T] {
|
|
|
|
|
|
return func(c *PoolConfig[T]) {
|
2025-05-22 23:29:50 +08:00
|
|
|
|
c.MaxConns = maxConns
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// WithIdleTimeout 设置空闲超时
|
2025-05-26 22:33:51 +08:00
|
|
|
|
func WithIdleTimeout[T Conn](timeout time.Duration) Option[T] {
|
|
|
|
|
|
return func(c *PoolConfig[T]) {
|
2025-05-22 23:29:50 +08:00
|
|
|
|
c.IdleTimeout = timeout
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// WithWaitTimeout 设置等待超时
|
2025-05-26 22:33:51 +08:00
|
|
|
|
func WithWaitTimeout[T Conn](timeout time.Duration) Option[T] {
|
|
|
|
|
|
return func(c *PoolConfig[T]) {
|
2025-05-22 23:29:50 +08:00
|
|
|
|
c.WaitTimeout = timeout
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// WithHealthCheckInterval 设置健康检查间隔
|
2025-05-26 22:33:51 +08:00
|
|
|
|
func WithHealthCheckInterval[T Conn](interval time.Duration) Option[T] {
|
|
|
|
|
|
return func(c *PoolConfig[T]) {
|
2025-05-22 23:29:50 +08:00
|
|
|
|
c.HealthCheckInterval = interval
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// WithOnPoolClose 设置连接池关闭回调
|
2025-05-26 22:33:51 +08:00
|
|
|
|
func WithOnPoolClose[T Conn](fn func() error) Option[T] {
|
|
|
|
|
|
return func(c *PoolConfig[T]) {
|
2025-05-22 23:29:50 +08:00
|
|
|
|
c.OnPoolClose = fn
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-05-26 22:33:51 +08:00
|
|
|
|
|
|
|
|
|
|
// WithOnConnClose 设置连接关闭回调, 若返回的错误不为nil,则不关闭连接
|
|
|
|
|
|
func WithOnConnClose[T Conn](fn func(conn T) error) Option[T] {
|
|
|
|
|
|
return func(c *PoolConfig[T]) {
|
|
|
|
|
|
c.OnConnClose = fn
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-05-27 22:56:54 +08:00
|
|
|
|
|
|
|
|
|
|
/**** GetOption Config ****/
|
|
|
|
|
|
|
|
|
|
|
|
// GetOption 用于配置 Get 的行为
|
|
|
|
|
|
type GetOption func(*getOptions)
|
|
|
|
|
|
|
|
|
|
|
|
// 控制 Get 行为的选项
|
|
|
|
|
|
type getOptions struct {
|
|
|
|
|
|
updateLastActive bool // 是否更新 lastActive,默认 true
|
2025-05-29 20:24:48 +08:00
|
|
|
|
newConn bool // 连接不存在时是否创建新连接,默认 true
|
2025-05-27 22:56:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-29 20:24:48 +08:00
|
|
|
|
var (
|
|
|
|
|
|
defaultGetOptions = getOptions{
|
|
|
|
|
|
updateLastActive: true,
|
|
|
|
|
|
newConn: true,
|
|
|
|
|
|
}
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// WithGetNoUpdateLastActive 返回一个 Option,禁用更新 lastActive
|
|
|
|
|
|
func WithGetNoUpdateLastActive() GetOption {
|
2025-05-27 22:56:54 +08:00
|
|
|
|
return func(o *getOptions) {
|
|
|
|
|
|
o.updateLastActive = false
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-05-29 20:24:48 +08:00
|
|
|
|
|
|
|
|
|
|
// WithGetNoCreateConn 禁用获取时连接不存在创建连接
|
|
|
|
|
|
func WithGetNoNewConn() GetOption {
|
|
|
|
|
|
return func(o *getOptions) {
|
|
|
|
|
|
o.newConn = false
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|