首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(go-sql-driver/mysql) packets.go中意外的EOF和忙缓冲区

(go-sql-driver/mysql) packets.go中意外的EOF和忙缓冲区
EN

Stack Overflow用户
提问于 2017-11-21 14:49:48
回答 3查看 4.5K关注 0票数 3

我在go-sql-driver/mysql中得到了unexpected EOF and busy buffer错误,尽管在按照建议的here设置了SetConnMaxLifetimeSetMaxIdleConnsSetMaxOpenConns之后。有没有人能告诉我这个问题的正确解决方案?

代码语言:javascript
复制
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)

}
EN

回答 3

Stack Overflow用户

发布于 2017-12-07 00:03:56

我设置了一个本地MySQL数据库并运行了您的代码:

代码语言:javascript
复制
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语句如下所示:

代码语言:javascript
复制
CREATE TABLE `tbl2` (
`col1` varchar(25) DEFAULT NULL,
`col2` int(11) DEFAULT NULL,
`col3` bigint(20) unsigned DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

您的表结构是什么样子的?

票数 2
EN

Stack Overflow用户

发布于 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:]),某种超时。

票数 2
EN

Stack Overflow用户

发布于 2021-05-14 13:25:46

这些对我来说都不管用。我已经使用了Docker容器,然后我尝试使用MySQL客户端从本地机器登录它。

mysql协议本地主机-P 3306 -h =tcp

在这之后,围棋程序运行得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47406876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档