我在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
}
在不停止程序的情况下杀死第三个进程需要做什么
首先,在 Go 中,习惯上将错误放在
if
-blocks 中,从而在没有此类错误时将错误处理代码与代码分开。其次,没有开库检查,万一出错db.Query()
又会defer db.Close()
引起panic。第三,rows.Err()
未检查database/sql#Rows。好吧,实际上,数据库使用连接池并在之后重用这些连接。在这种情况下,创建新连接只会从池中获取连接,而不是创建新连接。例如,如果您的应用程序使用 100 个连接,那么它们很可能都在池中 - 永久打开以便以后可以使用。出于这些目的,驱动程序不会关闭您的连接。
注意
其中分别是连接生命周期、最大挂起连接数和最大打开连接数。所有这些设置都与连接池有关。
好吧,其余的取决于使用哪个 MySQL 驱动程序。并且在此应用程序中是否存在与同一数据库的任何其他连接。