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 {