go database_error ai_generated true

database/sql: connection is already closed or busy

ID: go/sql-conn-busy

Also available as: JSON · Markdown
85%Fix Rate
87%Confidence
50Evidence
2023-01-01First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
1 active

Root Cause

The database connection pool is exhausted or a connection was used concurrently. Common causes: unclosed rows, leaked connections from missing defer rows.Close(), or pool size too small for concurrent load.

generic

Workarounds

  1. 92% success Always defer rows.Close() immediately after Query
    rows, err := db.QueryContext(ctx, query)
    if err != nil { return err }
    defer rows.Close()
    for rows.Next() { ... }

    Sources: https://pkg.go.dev/database/sql#Rows.Close

  2. 88% success Configure connection pool limits based on expected concurrency
    db.SetMaxOpenConns(25)
    db.SetMaxIdleConns(10)
    db.SetConnMaxLifetime(5 * time.Minute)
    db.SetConnMaxIdleTime(1 * time.Minute)

    Sources: https://pkg.go.dev/database/sql#DB.SetMaxOpenConns

Dead Ends

Common approaches that don't work:

  1. Set MaxOpenConns to unlimited (0) 70% fail

    Database servers have connection limits — unlimited Go connections hit the DB limit and cause 'too many connections' errors instead

  2. Create a new sql.DB for each request 85% fail

    sql.DB is designed to be a long-lived pool — creating new pools per request exhausts OS resources and DB connections

Error Chain

Leads to:
Preceded by:
Frequently confused with: