sql.Open() 返回 *sql.DB 类型的变量
我有一个函数可以调用其他 10 个函数,这些函数都需要进行数据库调用
是否更正确/更有效:
- 将 *sql.DB 指针发送到每个函数,或者
- 在每个函数中创建一个新的 *sql.DB 对象
Meaning
func DoLotsOfThings() {
db, _ := sql.Open()
defer db.Close()
DoTask1(db)
DoTask2(db)
}
or
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 http://code.google.com/p/odbc,这让我相信每个功能都应该有自己的功能,并且我可以依赖驱动程序的内部结构。
EDIT
RE驱动器损坏,仅在高流量环境下发生。它只会在十分钟左右的时间后发生。这让我相信存在某种内存泄漏,导致使用驱动程序停止工作。但是,我为 *sql.DB 的每个实例推迟 db.Close() ,所以我不知道还能做什么来解决这个问题。
andybalholm 说连接池是在内部处理的,这似乎是准确的,因为它只会在我尝试执行某些操作后中断,而不是在我调用 sql.Open() 时中断
如果我让 Go 应用程序保持运行,它将无法执行任何类型的 SQL 查询,但如果我尝试单独连接到 MSSQL 并运行查询来运行其他 Go 测试,它就会起作用。
声明一个var db *sql.DB
全局,然后在您的代码中重用它。这是一个示例(简化):
var db *sql.DB
func DoLotsOfThings() {
DoTask1(db)
DoTask2(db)
}
func main() {
db, _ = sql.Open() # or whatever you use
defer db.Close()
DoLotsOfThings()
}
声明*sql.DB
全球范围内还有一些额外的好处,例如设置最大空闲连接数 http://golang.org/pkg/database/sql/#DB.SetMaxIdleConns(调节连接池大小)或准备 http://golang.org/pkg/database/sql/#DB.Prepare跨应用程序的 SQL 语句。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)