Подключения к MySQL

208
12 января 2020, 10:50

Наприсал функцию на go, которая поднимает соединение с бд, вынимает данные и закрывает соединение, но после отработки функции все равно остается соединение, до тех пор пока не приостановлю программу

func selectSites() (sites siteList, list string) {
    connectSetting := fmt.Sprintf(
        "%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True",
        config.AppConfig.DB.User,
        config.AppConfig.DB.Pass,
        config.AppConfig.DB.Host,
        strconv.Itoa(config.AppConfig.DB.Port),
        config.AppConfig.DB.Name,
    )
    db, err := sql.Open("mysql", connectSetting)
    defer db.Close()

    rows, err := db.Query(config.AppConfig.SQL.SelectList)
    defer rows.Close()
    if err == nil {
        for rows.Next() {
            err := rows.Scan(&list)
            if err != nil {
                config.InLog("selectSites list parse err %s", err.Error())
                continue
            }
        }
    } else {
        config.InLog("selectSites list err %s", err.Error())
    }
    return
}

Количество процессов в бд до запуска программы

Количество процессов в бд после отработки функции

Что нужно сделать, чтоб убить 3й процесс не останавливая программу

Answer 1

Во-первых, в Го принято выносить ошибки в if-блоки, тем самым отделяя код обработки ошибок от кода, когда этих ошибок нету. Во-вторых, нет проверки открытия базы данных, в случае ошибки db.Query() и defer db.Close() вызовут панику. В-третьих, rows.Err() не проверяется database/sql#Rows.

Ну и собственно, базы данных используют пул подключений и переиспользуют эти подключения после. В таком случае, создание нового подключения просто возьмёт подключение из пула, вместо того, чтобы создавать новое. Например, если Ваше приложение использует 100 подключений, то, скорее всего, все они будут в пуле - постоянно открытыми, чтобы их можно было использовать после. И Ваше подключение не закрывается драйвером для этих целей.

Обратите внимание на

  • SetConnMaxLifetime
  • SetMaxIdleConns
  • SetMaxOpenConns

Что соответственно, время жизни подключения, максимум ожидающих подключений и максимум открытых подключений. Все эти настройки относятся к пулу подключений.

func selectSites() (sites siteList, list string) {
    connectSetting := fmt.Sprintf(
        "%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True",
        config.AppConfig.DB.User,
        config.AppConfig.DB.Pass,
        config.AppConfig.DB.Host,
        strconv.Itoa(config.AppConfig.DB.Port),
        config.AppConfig.DB.Name,
    )
    db, err := sql.Open("mysql", connectSetting)
    if err != nil {
        config.InLog("opening DB %v", err)
        return
    }
    defer db.Close()
    rows, err := db.Query(config.AppConfig.SQL.SelectList)
    defer rows.Close()
    if err != nil {
        config.InLog("selectSites list err %v", err)
        return
    }
    for rows.Next() {
        err := rows.Scan(&list)
        if err != nil {
            config.InLog("selectSites list parse err %v", err)
            return
        }
    }
    if err := rows.Err(); err != nil {
        config.InLog("selectSites list parse err %v", err)
        return
    }
    return
}

Ну а остальное зависит уже от того, какой MySQL-драйвер используется. И есть ли ещё в этом приложении подключение к той же БД.

READ ALSO
Не сохраняется переменная javascript

Не сохраняется переменная javascript

Скачиваю методом get файл с сервера, и вывожу в console браузераВсё выводится как надо, но если пытаюсь сохранить переменную и вывести её потом,...

175
Подключение плагина jQuery

Подключение плагина jQuery

Как подключить плагин jQuery nestedSortable? В инструкции указана команда "meteor add ilikenwf:nested-sortable"Метеор установлен, но такой командой подключить плагин...

205
Не рабoтает скрипт jQuery

Не рабoтает скрипт jQuery

Проект делаю в WebStormВ нем два скрипта

217
Как правильно это реализиовать [закрыт]

Как правильно это реализиовать [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

225