Golang,mysql:错误 1040:连接过多
Golang, mysql: Error 1040: Too many connections
我正在使用 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
第一个很慌。
只打开一次数据库怎么会出现多个连接,如何关闭?
尝试使准备好的语句 db.Prepare(query string) (*Stmt, error)
比 stmt.Query
或 stmt.Exec
比 stmt.Close
重用连接。
sql.Open doesn't really open a connection to your database.
A sql.DB 维护一个数据库连接池。每次您查询数据库时,您的程序都会尝试从该池中获取连接或创建一个新的连接。一旦您关闭这些连接,它们就会放回池中。
这就是 rows.Close()
所做的。
当您调用 Scan(...)
.
时,您的 db.QueryRow("...")
在内部做同样的事情
基本问题是您创建了太多查询,每个查询都需要一个连接,但您关闭连接的速度不够快。这样你的程序必须为每个查询创建一个新连接。
您可以通过在 sql.DB 上调用 SetMaxOpenConns 来限制程序使用的最大连接数。
有关详细信息,请参阅 http://go-database-sql.org/surprises.html。
您从 sql.Open
返回的 *DB
对象不对应于 单个 连接。最好将其视为数据库的句柄:它为您管理一个连接池。
您可以通过 `(*DB).SetMaxOpenConns and its pair 控制空闲连接的打开连接数。
所以基本上这里发生的是 db.Query
和 db.QueryRow
尝试为自己获取连接,并且数据库句柄没有对同时连接的数量施加任何限制,因此您的代码出现混乱当它打开超过 mysql 可以处理的范围时。
我的程序总是连接到数据库。 (考勤实时人脸识别)
因此打开和关闭数据库连接是没有价值的。
因此它一直打开数据库连接只是初始化程序。
func GetAllFaces() interface{} {
OpenDatabaseConnection() ...
}
但是后来访问数据库,增加了连接数,导致程序崩溃。但是关闭 rows
对象至少不会保持活动连接。 (对我来说 1)
func SaveAttendance(faceId int, date time.Time) error {
sqlQuery := fmt.Sprintf("SELECT ... "))
rows, err := DB.Query(sqlQuery) ...
err = rows.Close()
return err
}
您好,请问您使用后可以关闭连接吗
db, err := sql.Open("mysql", str)
defer db.Close() // close after end scope
我正在使用 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
第一个很慌。
只打开一次数据库怎么会出现多个连接,如何关闭?
尝试使准备好的语句 db.Prepare(query string) (*Stmt, error)
比 stmt.Query
或 stmt.Exec
比 stmt.Close
重用连接。
sql.Open doesn't really open a connection to your database.
A sql.DB 维护一个数据库连接池。每次您查询数据库时,您的程序都会尝试从该池中获取连接或创建一个新的连接。一旦您关闭这些连接,它们就会放回池中。
这就是 rows.Close()
所做的。
当您调用 Scan(...)
.
db.QueryRow("...")
在内部做同样的事情
基本问题是您创建了太多查询,每个查询都需要一个连接,但您关闭连接的速度不够快。这样你的程序必须为每个查询创建一个新连接。
您可以通过在 sql.DB 上调用 SetMaxOpenConns 来限制程序使用的最大连接数。
有关详细信息,请参阅 http://go-database-sql.org/surprises.html。
您从 sql.Open
返回的 *DB
对象不对应于 单个 连接。最好将其视为数据库的句柄:它为您管理一个连接池。
您可以通过 `(*DB).SetMaxOpenConns and its pair 控制空闲连接的打开连接数。
所以基本上这里发生的是 db.Query
和 db.QueryRow
尝试为自己获取连接,并且数据库句柄没有对同时连接的数量施加任何限制,因此您的代码出现混乱当它打开超过 mysql 可以处理的范围时。
我的程序总是连接到数据库。 (考勤实时人脸识别)
因此打开和关闭数据库连接是没有价值的。
因此它一直打开数据库连接只是初始化程序。
func GetAllFaces() interface{} {
OpenDatabaseConnection() ...
}
但是后来访问数据库,增加了连接数,导致程序崩溃。但是关闭 rows
对象至少不会保持活动连接。 (对我来说 1)
func SaveAttendance(faceId int, date time.Time) error {
sqlQuery := fmt.Sprintf("SELECT ... "))
rows, err := DB.Query(sqlQuery) ...
err = rows.Close()
return err
}
您好,请问您使用后可以关闭连接吗
db, err := sql.Open("mysql", str)
defer db.Close() // close after end scope