我正在实现一个代码,在该代码中我需要以固定的间隔执行一些操作。
它们很少与从mysql数据库获取数据有关。
为了以固定的时间间隔安排这些动作,我使用Gocron。运行良好。
对于数据库,到目前为止,我正在主程序的开头创建一个实例,并将其传递给子例程。我正在使用https://github.com/jmoiron/sqlx与数据库一起工作。
代码流为:
i-初始化资源。例如,db = sql.Open;将DB以通用结构传递给所有子例程
ii-使用Gocron的scheduleAction(根据需要传递资源)
iii-动作是特定的子例程,使用给定资源(例如,数据库)根据需要执行任务
在少数情况下,需要重新启动mysql服务。
然后按预期方式出现错误,指出无效的连接。就像是
[mysql] packets.go:33: unexpected EOF
[mysql] packets.go:130: write tcp 127.0.0.1:36191->127.0.0.1:3306: write: broken pipe
[mysql] connection.go:312: invalid connection
为了解决这个问题,我做了一个实现来获取子例程中的DB连接,并使用db.close()关闭。有了这个,我得到了与太多打开的连接有关的错误。我已经检查了行的正确关闭以及扫描的用法。并查看正在遵循的建议。
我想了解在我的情况下如何进行数据库打开和关闭处理。
最佳答案
您可以使用sync.Once
来防止这种情况:
var conn *sql.DB // Set package-wide, but not exported
var once sync.Once
func GetConnection() *sql.DB {
once.Do(func() {
var err error
if conn, err = sql.Open("postgres", "<credentials>"); err != nil {
log.Panic(err)
}
conn.SetMaxOpenConns(20) // Sane default
conn.SetMaxIdleConns(0)
conn.SetConnMaxLifetime(time.Nanosecond)
})
return conn
}
阅读此:https://aaronoellis.com/articles/preventing-max-connection-errors-in-go
关于mysql - 在子程序中处理数据库的打开和关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50520954/