mysql - Golang MySQL 错误 - packets.go :33: unexpected EOF

标签 mysql go

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

[mysql] 2016/10/11 09:17:16 packets.go:33: unexpected EOF

这是我处理所有数据库连接的数据库包:

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 的摘录:

// 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 并让进程运行,就在我得到这个错误的地方,这是控制台打印的内容:

********** CHECKING PING
************ CONNECTION STILL ACTIVE
[mysql] 2016/10/11 11:57:27 packets.go:33: unexpected EOF
********** CHECKING PING
************ CONNECTION STILL ACTIVE

最佳答案

看起来像 github issue 的链接提供了修复。修复,至少对于我的情况是将 MaxIdleConnections 设置为 0。我已经将服务器保持运行 24 小时,每隔几个小时对其运行一次查询,但尚未重现错误。

感谢@city 提供链接。

关于mysql - Golang MySQL 错误 - packets.go :33: unexpected EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39980902/

相关文章:

Golang Config File 应该加载自己的包

Mysql消息应用列出每个用户最近5条消息

mysql - 选择具有 IN 范围和 LIMIT 的查询

php - PDO 设置 PDO::MYSQL_ATTR_FOUND_ROWS 失败

mysql - 在 JPA 条件查询中使用 mysql 选项 SQL_CALC_FOUND_ROWS

node.js - GCF 部署失败(地区/计费)

SQLX 扫描到结构数组

php - 查询结果反转

javascript - Golang 中的 JSON.stringify 等价于 map[string]interface{}

go - 从 golang 中的 tcp 连接读取