【发布时间】:2013-11-27 11:31:42
【问题描述】:
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 查询,但如果我尝试单独运行其他 Go 测试连接到 MSSQL 并运行查询,它就可以工作。
【问题讨论】:
-
如果你可以在这里发布一个可重现的例子code.google.com/p/odbc/issues/list,我会尝试修复它。