sql.DB - это пул соединений с БД, а не одно соединение. Он сам открывает, переиспользует и закрывает соединения. Создавать отдельный sql.DB на каждый запрос не нужно - один пул на приложение, передавать его в хендлеры и репозитории.
db, err := sql.Open("driver", dsn)
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)
row := db.QueryRow("SELECT ...")
// соединение берётся из пула и возвращается после закрытия rows/statement