我正在使用github.com/go-sql-driver/mysql驱动程序.
我打开一个数据库:
db, err := sql.Open("mysql", str)
Run Code Online (Sandbox Code Playgroud)
然后我有两个函数,每个函数调用200次,每个函数使用以下mysql代码:
rows, err := db.Query("select name from beehives")
if err != nil {
panic(err)
}
defer rows.Close()
Run Code Online (Sandbox Code Playgroud)
第二:
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
Run Code Online (Sandbox Code Playgroud)
第一个是慌乱.
当我只打开一次数据库时,怎么会有多个连接?如何关闭它们?
nus*_*tin 24
sql.DB维护与数据库的连接池.每次查询数据库时,程序都会尝试从此池中获取连接,否则将创建一个新的连接.一旦关闭它们,这些连接就会被放回池中.
这是做什么的rows.Close().你db.QueryRow("...")做同样的事情在内部,当你打电话Scan(...).
基本问题是您创建了太多查询,每个查询都需要连接,但您没有足够快地关闭连接.这样,您的程序必须为每个查询创建一个新连接.
您可以通过在sql.DB上调用SetMaxOpenConns来限制程序使用的最大连接数.
有关更多信息,请参阅http://go-database-sql.org/surprises.html.
*DB您从中获取的对象sql.Open不对应于单个连接。最好将其视为数据库的句柄:它为您管理连接池。
您可以控制打开的连接与数`(* DB).SetMaxOpenConns和其对怠速连接。
因此,基本上发生了这种情况,db.Query并db.QueryRow试图自己获取一个连接,并且数据库句柄对并发连接数没有任何限制,因此,当打开的代码超出了mysql的处理能力时,您的代码会感到恐慌。
| 归档时间: |
|
| 查看次数: |
14847 次 |
| 最近记录: |