Не работает ф-я подкл к БД при частом её вызове.?

Добрый день. Есть функция для работы с БД
func new_query_select(Query string, args ...interface{}) []mysql.Row{
        db := mysql.New("tcp", "", "127.0.0.1:3306", "root", "password", "test")
        err := db.Connect()
        if err != nil {
            log.Println("Не удалось подключиться к базе данных")
        }
        rows, _, err := db.Query(Query,args...)
        if err != nil {
            log.Println("Не удалось выполнить запрос",Query)
        }
        return rows
    }

В других функциях я формирую sql и передаю в эту выполняющюю функцию.
Возможно Вы скажете- это корявый вариант, но всё-же если идти по этому пути- я столкнулся с проблемой, когда начал имитировать большое количество запросов и вызывать эту функцию - мне выдало исключение, "Не удалось выполнить запрос".
На сколько я понял-одна из функций приложения обратилась к этой функции(new_query_select) когда она работала с БД, потому что, если запросы идут редко-то всё нормально. Как только начинаю слать, скажем 10-15 запросов в секунду, что-то происходит и после этого уже никакой другой запрос не работает и переходит в исключение "Не удалось выполнить запрос".

Вопрос: Что делать, что-б не было этого глюка? Может его в горутину поместить или что можно сделать?
  • Вопрос задан
  • 184 просмотра
Пригласить эксперта
Ответы на вопрос 1
@mantyr
Пишу много Golang кода с удовольствием:)
Вы делаете слишком много коннектов.
Вы забываете закрывать ресурс полученный через db.Query(), конечно если вы используете go-sql-driver/mysql а не что-то другое.
Вы не выводите содержимое err, а ведь там много полезного может быть, например содержимое ошибки... в которой простым языком написанно что именно сломалось.

Не создавайте коннект на каждый запрос, создайте одно подключение (на самом деле там внутри пул соединений) и просто используйте его везде и не забывайте закрывать ресурсы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы