Closed
Description
hello, I found a bug when using this driver, and I'm not sure this bug is from driver or database/sql.
go version: 1.2
driver version: 1.1 (9a7aa3606b82e2081a13a008ada88dfdb96c20fd)
mysql version: mysql ver 15.1 distrib 10.0.4 - mariadb
client os: win7
bug describe in brief:
- Stmt.QueryRow() failed return results util next call. here are steps:
a). prepare a Stmt with "select" query
b). kill database connection.
c). call Stmt.QueryRow.Scan() will fail util next call
outputs:
[MySQL] 2014/01/09 10:27:35 packets.go:30: EOF
[MySQL] 2014/01/09 10:27:35 statement.go:24: Invalid Connection
[MySQL] 2014/01/09 10:27:35 statement.go:24: Invalid Connection
- Stmt.Exec failed return results, and never reconnect to database, here are steps:
a). prepare a Stmt with "insert" query.
b). kill database connection.
c). call Stmt.Exec() will fail and never reconnect to database.
outputs:
[MySQL] 2014/01/09 10:38:25 packets.go:30: EOF <----first call Stmt.Exec()
2014/01/09 10:38:25 [::1] - �[32;1m GET /test2�[0m - 1ms
[MySQL] 2014/01/09 10:38:32 statement.go:39: Invalid Connection <---- next call to Stmt.Exec()
2014/01/09 10:38:32 [::1] - �[32;1m GET /test2�[0m - 1.0001ms
my test source code:
package main
import (
"database/sql"
"fmt"
"math/rand"
"time"
)
import "github.com/hoisie/web"
import _ "github.com/go-sql-driver/mysql"
import "runtime"
const sql1 = "select username from user_table where uid=?"
const sqlInsertUser = "insert into user_table set username = ?, password = ?, source=?"
var db *sql.DB
var db2 *sql.DB
var stmt *sql.Stmt
var stmt2 *sql.Stmt
func panicIf(err error) {
if err != nil {
panic(err)
}
}
func init() {
var err error
db, err = sql.Open("mysql", "root:root@tcp(192.168.0.32:3306)/userdb")
panicIf(err)
//db2, err = sql.Open("mysql", "root:root@tcp(192.168.0.32:3306)/userdb")
stmt, err = db.Prepare(sql1)
panicIf(err)
stmt2, err = db.Prepare(sqlInsertUser)
panicIf(err)
runtime.GOMAXPROCS(runtime.NumCPU())
rand.Seed(time.Now().UnixNano())
}
func test() string {
var username string
stmt.QueryRow(14740).Scan(&username)
return username
}
func test2() string {
iu := rand.Uint32()
ip := rand.Uint32()
su := fmt.Sprintf("%d", iu)
sp := fmt.Sprintf("%d", ip)
_, err := stmt2.Exec(su, sp, "")
if err != nil {
return err.Error()
}
return "Ok"
}
func main() {
web.Get("/", test)
web.Get("/test2", test2)
web.Run("0.0.0.0:80")
}
Metadata
Metadata
Assignees
Labels
No labels