首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang MySQL错误- packets.go:33:意外的EOF

Golang MySQL错误- packets.go:33:意外的EOF
EN

Stack Overflow用户
提问于 2016-10-11 23:24:21
回答 3查看 15.3K关注 0票数 6

我将我的整个代码库从PHP切换到Go,在运行的几个进程中,我随机得到了这个错误:

代码语言:javascript
复制
[mysql] 2016/10/11 09:17:16 packets.go:33: unexpected EOF

下面是我的db包,它处理到数据库的所有连接:

代码语言:javascript
复制
package db

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "pkg/db"
)

var connection *sql.DB
var err error

func GetConnection() *sql.DB {
    if connection != nil {
        fmt.Println("********** CHECKING PING")
        err = connection.Ping()
        if err == nil {
            fmt.Println("************ CONNECTION STILL ACTIVE")
            return connection
        } else {
            fmt.Println("********** PING ERROR: " + err.Error())
        }
    }

    connection, err = sql.Open("mysql", db.DEVUSER + ":" + db.DEVUSER_PASSWORD + "@tcp(localhost:3306)/main?parseTime=true")
    if err != nil {
        panic(err)
    }

    return connection
}

我在这个db包中做错了什么导致抛出这个错误吗?这个错误到底是什么意思?如果有一个打开的连接,我确保返回当前的连接,因此对于多个请求,它使用相同的连接对象。

下面是mysql packets.go的摘录:

代码语言:javascript
复制
// Read packet to buffer 'data'
func (mc *mysqlConn) readPacket() ([]byte, error) {
    var payload []byte
    for {
        // Read packet header
        data, err := mc.buf.readNext(4)
        if err != nil {
            errLog.Print(err)
            mc.Close()
            return nil, driver.ErrBadConn
        }

        // Packet Length [24 bit]
        pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16)

        if pktLen < 1 {
            errLog.Print(ErrMalformPkt)
            mc.Close()
            return nil, driver.ErrBadConn
        }

        // Check Packet Sync [8 bit]
        if data[3] != mc.sequence {
            if data[3] > mc.sequence {
                return nil, ErrPktSyncMul
            }
            return nil, ErrPktSync
        }
        mc.sequence++

        // Read packet body [pktLen bytes]
        data, err = mc.buf.readNext(pktLen)
        if err != nil {
            errLog.Print(err)
            mc.Close()
            return nil, driver.ErrBadConn
        }

        isLastPacket := (pktLen < maxPacketSize)

        // Zero allocations for non-splitting packets
        if isLastPacket && payload == nil {
            return data, nil
        }

        payload = append(payload, data...)

        if isLastPacket {
            return payload, nil
        }
    }
}

第一个"errLog.Print(err)“是"Read packet header”部分中的33行。

任何帮助都是非常感谢的!

我向连接包中添加了几个log.Println,并让进程运行,就在我得到这个错误的地方,控制台打印了以下内容:

代码语言:javascript
复制
********** CHECKING PING
************ CONNECTION STILL ACTIVE
[mysql] 2016/10/11 11:57:27 packets.go:33: unexpected EOF
********** CHECKING PING
************ CONNECTION STILL ACTIVE
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-10 04:46:07

看起来指向github issue的链接提供了修复。修复方法是将MaxIdleConnections设置为0,至少对我的情况是这样。我已经让一台服务器运行了24小时,每隔几个小时就对它运行一次查询,但还没有重现错误。

感谢@city的链接。

票数 3
EN

Stack Overflow用户

发布于 2020-11-23 18:41:14

代码语言:javascript
复制
import (
    "database/sql"
    "time"
)
//..snip...
db, err = sql.Open("mysql", url)
db.SetConnMaxLifetime(time.Minute * 4) // <-- this

都是为了我。说明:here

票数 1
EN

Stack Overflow用户

发布于 2019-12-20 18:41:31

DSN增加了net_write_timeout选项

代码语言:javascript
复制
root:root@tcp(localhost:3306)/prod?net_write_timeout=6000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39980902

复制
相关文章

相似问题

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