doukuo9116 2015-11-07 03:38 采纳率: 100%
浏览 15
已采纳

我应该在程序中多久调用一次sql.Open?

As the title says I don't know if having multiple sql.Open statements is a good or bad thing or what or if I should have a file with just an init that is something like:

var db *sql.DB


func init() {
    var err error
    db, err = sql.Open
}

just wondering what the best practice would be. Thanks!

  • 写回答

1条回答 默认 最新

  • dongtingrun4973 2015-11-07 03:43
    关注

    You should at least check the error.
    As mentioned in "Connecting to a database":

    Note that Open does not directly open a database connection: this is deferred until a query is made. To verify that a connection can be made before making a query, use the Ping function:

    if err := db.Ping(); err != nil {
      log.Fatal(err)
    }
    

    After use, the database is closed using Close.

    If possible, limit the number of opened connection to a database to a minimum.
    See "Go/Golang sql.DB reuse in functions":

    You shouldn't need to open database connections all over the place.
    The database/sql package does connection pooling internally, opening and closing connections as needed, while providing the illusion of a single connection that can be used concurrently.

    As elithrar points out in the comment, database.sql/#Open does mention:

    The returned DB is safe for concurrent use by multiple goroutines and maintains its own pool of idle connections.
    Thus, the Open function should be called just once.
    It is rarely necessary to close a DB.

    As mentioned here

    Declaring *sql.DB globally also have some additional benefits such as SetMaxIdleConns (regulating connection pool size) or preparing SQL statements across your application.

    You can use a function init, which will run even if you don't have a main():

    var db *sql.DB
    func init() {
        db, err = sql.Open(DBparms....)
    }
    

    init() is always called, regardless if there's main or not, so if you import a package that has an init function, it will be executed.
    You can have multiple init() functions per package, they will be executed in the order they show up in the code (after all variables are initialized of course).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM