sql.Open()返回* sql.DB类型的变量
我有一个函数可以调用其他10个都需要进行数据库调用的函数
是否更正确/更有效:
含义
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测试,则它将起作用。
您不需要到处都打开数据库连接。数据库/ sql软件包内部进行连接池化,根据需要打开和关闭连接,同时提供了可以同时使用的单个连接的错觉。
可能您需要在其他地方寻找导致驱动程序损坏的原因。有关此问题的更多详细信息将使人们更容易了解正在发生的事情。