我正在使用github.com/go-sql-driver/mysql驱动程序。
我打开一个数据库:
db, err := sql.Open("mysql", str)
然后我有两个函数,每个函数用下面的mysql代码调用200次:
rows, err := db.Query("select name from beehives") if err != nil { panic(err) } defer rows.Close()
第二:
err = db.QueryRow("select id, secret, shortname from beehives where shortname = ?", beehive).Scan(&id, &secre switch { case err == sql.ErrNoRows: err = errors.New("Beehive '"+beehive+"' not found.") case err != nil: panic("loginBeehive: "+ err.Error()) default: // ... do the work
第一个是恐慌。
当我只打开数据库一次时,如何有多个连接?如何关闭它们?
sql.Open并没有真正打开与数据库的连接。
sql.DB维护与数据库的连接池。每次查询数据库时,程序都会尝试从该池获取连接,否则将尝试创建一个新池。一旦关闭这些连接,它们就会放回池中。
这是做什么的rows.Close()。你db.QueryRow("...")做同样的事情在内部,当你打电话Scan(...)。
rows.Close()
db.QueryRow("...")
Scan(...)
基本问题是您创建的查询过多,每个查询都需要一个连接,但是关闭连接的速度不够快。这样,您的程序必须为每个查询创建一个新的连接。
您可以通过在sql.DB上调用SetMaxOpenConns来限制程序使用的最大连接数。
有关更多信息,请参见http://go-database-sql.org/surprises.html。