一尘不染

Go / Golang sql.DB在函数中的重用

go

sql.Open()返回* sql.DB类型的变量

我有一个函数可以调用其他10个都需要进行数据库调用的函数

是否更正确/更有效:

  • 发送* sql.DB指针到每个函数,或
  • 在每个函数中创建一个新的* sql.DB对象

含义

func DoLotsOfThings() {
    db, _ := sql.Open()
    defer db.Close()
    DoTask1(db)
    DoTask2(db)
}

要么

func DoLotsOfThings() {
    DoTask1()
    DoTask2()
}

func DoTask1() {
    db, _ := sql.Open()
    defer db.Close()
}

func DoTask1() {
    db, _ := sql.Open()
    defer db.Close()
}

我问的原因是因为我当前正在向每个函数发送指针,而我的驱动程序似乎坏了。我正在使用http://code.google.com/p/odbc,这使我相信每个功能都应该有自己的功能,并且我可以依赖驱动程序的内部功能。

编辑

RE驱动程序损坏,仅在高流量环境下会发生。而且只会在十分钟左右的时间后发生。这使我相信存在某种内存泄漏,导致使用驱动程序停止工作。但是,我为*
sql.DB的每个实例推迟db.Close(),所以我不知道我还能做什么来解决此问题。

andybalholm说连接池是在内部处理的,这似乎是正确的,因为它只会在我尝试执行某些操作后才会中断,而不是在我调用sql.Open()时才会中断

如果我让Go应用程序保持运行状态,它将无法执行任何类型的SQL查询,但是如果我尝试单独运行连接到MSSQL并运行查询的其他Go测试,则它将起作用。


阅读 269

收藏
2020-07-02

共1个答案

一尘不染

您不需要到处都打开数据库连接。数据库/ sql软件包内部进行连接池化,根据需要打开和关闭连接,同时提供了可以同时使用的单个连接的错觉。

可能您需要在其他地方寻找导致驱动程序损坏的原因。有关此问题的更多详细信息将使人们更容易了解正在发生的事情。

2020-07-02