Наприсал функцию на 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й процесс не останавливая программу
Во-первых, в Го принято выносить ошибки в if-блоки, тем самым отделяя код обработки ошибок от кода, когда этих ошибок нету. Во-вторых, нет проверки открытия базы данных, в случае ошибки db.Query() и defer db.Close() вызовут панику. В-третьих, rows.Err() не проверяется database/sql#Rows.
Ну и собственно, базы данных используют пул подключений и переиспользуют эти подключения после. В таком случае, создание нового подключения просто возьмёт подключение из пула, вместо того, чтобы создавать новое. Например, если Ваше приложение использует 100 подключений, то, скорее всего, все они будут в пуле - постоянно открытыми, чтобы их можно было использовать после. И Ваше подключение не закрывается драйвером для этих целей.
Обратите внимание на
Что соответственно, время жизни подключения, максимум ожидающих подключений и максимум открытых подключений. Все эти настройки относятся к пулу подключений.
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-драйвер используется. И есть ли ещё в этом приложении подключение к той же БД.
Продвижение своими сайтами как стратегия роста и независимости