当前位置: 首页 > 面试题库 >

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

都沈浪
2023-03-14
问题内容

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.html" target="_blank">google.com/p/odbc,这使我相信每个功能都应该有自己的功能,并且我可以依赖驱动程序的内部功能。

编辑

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

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

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


问题答案:

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

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



 类似资料:
  • 问题内容: 是否可以使用Golang以类似的方式工作,例如函数重载或C#中的可选参数?还是另一种方式? 问题答案: 直接支持函数重载和可选参数。您可以解决它们,建立自己的参数结构。我的意思是这样(未经测试,可能无法使用…)编辑:现在已测试…

  • 问题内容: 该函数仅采用字符串切片: 但是,能够传递实现函数的任意对象会很好。 Go中是否有类似的东西,还是我必须用ToString方法来修饰现有类型并编写一个包装器? 问题答案: 将方法附加到任何命名类型,并享受任何自定义“ ToString”功能: 游乐场:http://play.golang.org/p/Azql7_pDAA 输出量

  • 问题内容: 我正在尝试在Go中的另一个函数中定义一个递归函数,但是我在努力获取正确的语法。我正在寻找这样的东西: 我想将Function2保留在Function1的范围内,因为它正在访问其范围的某些元素。 如何在Go中执行此操作? 非常感谢 问题答案: 如果它在声明它的行中,则无法访问它的内部。原因是您不是在指 函数, 而是指 变量 (类型是函数),并且只有在声明后才能访问它。 引用规格:声明和范

  • 问题内容: 我有一个结构,我希望使用一些合理的默认值对其进行初始化。 通常,这里要做的是使用构造函数,但是由于go在传统意义上并不是真正的OOP,所以它们不是真正的对象,也没有构造函数。 我注意到了init方法,但这是在包级别。还有其他类似的东西可以在结构级别使用吗? 如果不是,那么Go中这种事情的公认最佳实践是什么? 问题答案: 实际上有两种公认的最佳实践: 将结构的零值设为明智的默认值。(尽管

  • 问题内容: 我正在学习中,文档和交互式课程说,空可以容纳任何类型,因为它不需要其他实现的方法。 举个例子: …将打印出来… 因此,我想我的问题是这是实现通用函数的方法,还是还有另一种更合适的方法来实现它们。 问题答案: Go范式通常是通过在非空接口中实现行为来避免这种情况。例如,假设您要打印特定于类型的格式的内容: 或者,您可以为知道如何进行字符串自身设置的接口定义一个接口(该接口在库中以形式存在

  • 问题内容: 尝试使用Go的http包时,我无法确定的语法。尽管我尝试了其他一些被编译器拒绝的其他事情,但这里只有我标记的以下内容是我必须编译的。 该URL可以,因为可以正常使用,但是在我运行时,它只是一个空字符串,并且始终为零。我需要怎么做才能取出数据?编译器拒绝了其他尝试。 输出看起来像这样: 问题答案: 尝试给切片buf设置一个大小,例如 读取器最多读取给定缓冲区的len()。 来自io.go