All*_*n A 9 odbc unixodbc go freetds
sql.Open()返回*sql.DB类型的变量
我有一个函数调用其他所有需要进行数据库调用的函数
是否更正确/更有效:
含义
func DoLotsOfThings() {
db, _ := sql.Open()
defer db.Close()
DoTask1(db)
DoTask2(db)
}
Run Code Online (Sandbox Code Playgroud)
要么
func DoLotsOfThings() {
DoTask1()
DoTask2()
}
func DoTask1() {
db, _ := sql.Open()
defer db.Close()
}
func DoTask1() {
db, _ := sql.Open()
defer db.Close()
}
Run Code Online (Sandbox Code Playgroud)
我问的原因是因为我正在发送指向每个函数的指针,而我的驱动程序似乎打破了.我正在使用http://code.google.com/p/odbc,这让我相信每个功能都应该有自己的功能,并且我可以依赖于驱动程序的内部功能.
编辑
RE驱动器破损,它只发生在高流量环境下.它只发生在十分钟左右的时间之后.这让我相信存在某种内存泄漏会导致使用驱动程序停止工作.但是我为*sql.DB的每个实例推迟db.Close(),所以我不知道我还能做些什么来解决这个问题.
andybalholm说连接池是内部处理的,这似乎是准确的,因为它只在我尝试执行某些东西后才会中断,而不是在我调用sql.Open()时
如果我让Go应用程序运行,它将无法执行任何类型的SQL查询,但如果我尝试单独运行其他Go测试连接到MSSQL并运行查询,它就可以运行.
Kav*_*avu 19
声明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()
}
Run Code Online (Sandbox Code Playgroud)
*sql.DB全局声明还有一些额外的好处,例如SetMaxIdleConns(调节连接池大小)或在整个应用程序中准备 SQL语句.
您不需要在整个地方打开数据库连接.database/sql包在内部进行连接池,根据需要打开和关闭连接,同时提供可以同时使用的单个连接的错觉.
可能你需要到别处寻找你的司机破损的原因.关于这一点的更多细节将使人们更容易弄清楚发生了什么.