database/sql: fix accumulation of bad conns on prepared statements
Fixes an issue where prepared statements that outlive many
connections become expensive to invoke.
Fixes #6081
R=golang-dev
CC=bradfitz, golang-dev
https://golang.org/cl/12646044
diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go
index 352a7e8..f0c86a8 100644
--- a/src/pkg/database/sql/sql.go
+++ b/src/pkg/database/sql/sql.go
@@ -518,12 +518,12 @@
func (db *DB) connIfFree(wanted *driverConn) (*driverConn, error) {
db.mu.Lock()
defer db.mu.Unlock()
- if wanted.inUse {
- return nil, errConnBusy
- }
if wanted.dbmuClosed {
return nil, errConnClosed
}
+ if wanted.inUse {
+ return nil, errConnBusy
+ }
for i, conn := range db.freeConn {
if conn != wanted {
continue
@@ -590,6 +590,7 @@
if err == driver.ErrBadConn {
// Don't reuse bad connections.
db.mu.Unlock()
+ dc.Close()
return
}
if putConnHook != nil {