我正在使用github.com/go-sql-driver/mysql驱动程序.
我打开一个数据库:
db, err := sql.Open("mysql", str)
然后我有两个函数,每个函数调用200次,每个函数使用以下mysql代码:
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
第一个是慌乱.
当我只打开一次数据库时,怎么会有多个连接?如何关闭它们?
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 次 | 
| 最近记录: |