我正在实现一个代码,在该代码中我需要以固定的间隔执行一些操作。

它们很少与从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/

10-11 03:15
查看更多