@rmkkmkk

Golang to many connections как избежать?

Есть Метод который прослушивает порт 8083, при возникновении события массив передается в другой метод.
switch e["Event"] {
  case "SomeEvent":
    go someMethod(e)			
}

в методе открываю соединение с БД, выполняю запрос и закрываю соединение.
func someMethod(e map[string]string)  {
	
        var tag User

	db, err := sql.Open("mysql", "user:pass@tcp(10.10.10.10:3036)/dbname")
	if err != nil {
		log.Print(err.Error())
	}

	err = db.QueryRow("SELECT name FROM users where id = ?", e["ID"]).Scan(&tag.Name)
	if err != nil {
		panic(err.Error())
	}
	db.Close()

При выполнении вылетает to many connections.
Вопрос : Как мне открыть соединение один раз и использовать его в методе?
  • Вопрос задан
  • 436 просмотров
Решения вопроса 1
Например, можете вынести переменную db в отдельный пакет и сделать её там глобальной. В функции init() этого пакета сделайте подключение к БД. Потом просто используйте эту переменную там, где надо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@KirEv
думаю, если много запросов, на каждый запрос нужно создавать соединение - это уже ненужные расходы,

соединение с бд, как выше писали, всетаки лучше делать при старте сервиса, а не при новом запросе,

db.SetMaxOpenConns - решит задачу, но кажется мне, опять таки при множестве запросов, db.Close() не всегда будет успевать закрывать и опять будут проблемы..

вижу как-то так:

func someMethod(db *sql.DB, e map[string]string)  {

}

func main(){

 db, err := sql.Open("mysql", "user:pass@tcp(10.10.10.10:3036)/dbname")
  if err != nil {
    log.Print(err.Error())
  }
defer db.Close()

....
switch e["Event"] {
  case "SomeEvent":
    go someMethod(db,e)			
}
...

}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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