go
database_error
ai_generated
true
database/sql: connection is already closed or busy
ID: go/sql-conn-busy
85%Fix Rate
87%Confidence
50Evidence
2023-01-01First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| 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.
genericWorkarounds
-
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() { ... } -
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)
Dead Ends
Common approaches that don't work:
-
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
-
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: