我在go-sql-driver/mysql中得到了unexpected EOF and busy buffer错误,尽管在按照建议的here设置了SetConnMaxLifetime、SetMaxIdleConns和SetMaxOpenConns之后。有没有人能告诉我这个问题的正确解决方案?
db, err := sql.Open("mysql", "USERNAME:PASSWORD@tcp(IP:PORT)/DB?charset=utf8")
checkErr(err)
db.SetConnMaxLifetime(time.Second * 5)
db.SetMaxIdleConns(0)
db.SetMaxOpenConns(151)
rows, err := db.Query("Select col1, col2, col3 from tbl")
checkErr(err)
for rows.Next() {
var col1 string
var col2 int32
var col3 uint64
err = rows.Scan(&col1, &col2, &col3)
checkErr(err)
Process(col1, col2, col3)
}发布于 2017-12-07 00:03:56
我设置了一个本地MySQL数据库并运行了您的代码:
package main
import (
"database/sql"
"fmt"
"log"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
db, err := sql.Open("mysql", "root@tcp(localhost)/test?charset=utf8")
if err != nil {
log.Fatalln(err)
}
db.SetConnMaxLifetime(time.Second * 5)
db.SetMaxIdleConns(0)
db.SetMaxOpenConns(151)
rows, err := db.Query("SELECT col1, col2, col3 FROM tbl2")
if err != nil {
log.Fatalln(err)
}
for rows.Next() {
var col1 string
var col2 int32
var col3 uint64
err = rows.Scan(&col1, &col2, &col3)
if err != nil {
log.Fatalln(err)
}
fmt.Println(col1, col2, col3)
}
}..and它对我来说工作得很好。我的CREATE TABLE语句如下所示:
CREATE TABLE `tbl2` (
`col1` varchar(25) DEFAULT NULL,
`col2` int(11) DEFAULT NULL,
`col3` bigint(20) unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;您的表结构是什么样子的?
发布于 2018-03-30 23:56:50
我找到了两种解决packets.go:36: unexpected EOF错误的方法,第一种方法是将驱动程序更改为ziutek/mymysql驱动程序,工作正常,性能基本相同。
第二种方式,使用默认的驱动程序,是设置db.SetMaxIdleConns(100)和db.SetMaxOpenConns(100),我的mysql的max_connections是151,所以我认为限制到100就可以了。
此外,预准备语句的速度有了很大提高,在它们比Db.Query慢之前,现在至少快了一倍。(使用20个goroutine中的200k查询进行了测试)
我认为问题可能出在驱动程序go-sql-driver/mysql的文件buffer.go中,行:nn, err := b.nc.Read(b.buf[n:]),某种超时。
发布于 2021-05-14 13:25:46
这些对我来说都不管用。我已经使用了Docker容器,然后我尝试使用MySQL客户端从本地机器登录它。
mysql协议本地主机-P 3306 -h =tcp
在这之后,围棋程序运行得很好。
https://stackoverflow.com/questions/47406876
复制相似问题