diff --git a/pgxpool/pool.go b/pgxpool/pool.go index 236ba000..51f8afcc 100644 --- a/pgxpool/pool.go +++ b/pgxpool/pool.go @@ -22,10 +22,11 @@ var defaultMaxConnIdleTime = time.Minute * 30 var defaultHealthCheckPeriod = time.Minute type connResource struct { - conn *pgx.Conn - conns []Conn - poolRows []poolRow - poolRowss []poolRows + conn *pgx.Conn + conns []Conn + poolRows []poolRow + poolRowss []poolRows + maxAgeTime time.Time } func (cr *connResource) getConn(p *Pool, res *puddle.Resource[*connResource]) *Conn { @@ -219,11 +220,15 @@ func NewWithConfig(ctx context.Context, config *Config) (*Pool, error) { } } + jitterSecs := rand.Float64() * config.MaxConnLifetimeJitter.Seconds() + maxAgeTime := time.Now().Add(config.MaxConnLifetime).Add(time.Duration(jitterSecs) * time.Second) + cr := &connResource{ - conn: conn, - conns: make([]Conn, 64), - poolRows: make([]poolRow, 64), - poolRowss: make([]poolRows, 64), + conn: conn, + conns: make([]Conn, 64), + poolRows: make([]poolRow, 64), + poolRowss: make([]poolRows, 64), + maxAgeTime: maxAgeTime, } return cr, nil @@ -364,17 +369,7 @@ func (p *Pool) Close() { } func (p *Pool) isExpired(res *puddle.Resource[*connResource]) bool { - now := time.Now() - // Small optimization to avoid rand. If it's over lifetime AND jitter, immediately - // return true. - if now.Sub(res.CreationTime()) > p.maxConnLifetime+p.maxConnLifetimeJitter { - return true - } - if p.maxConnLifetimeJitter == 0 { - return false - } - jitterSecs := rand.Float64() * p.maxConnLifetimeJitter.Seconds() - return now.Sub(res.CreationTime()) > p.maxConnLifetime+(time.Duration(jitterSecs)*time.Second) + return time.Now().After(res.Value().maxAgeTime) } func (p *Pool) triggerHealthCheck() {