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

I am switching my entire code base from PHP to Go and during several processes that run, I randomly get this error:

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

Here is my db package that handles all connections to the database:

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
}

Is there anything I'm doing wrong with this db package that causes this error to be thrown? What exactly does this error mean? I make sure to return the current connection if there is one open so for multiple requests it uses the same connection object.

Here's an excerpt from the 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
        }
    }
}

The first "errLog.Print(err)" is line 33 in the "Read packet header" section.

Any help is greatly appreciated!

I added a few log.Println to the connection package and let the process run, and right where I get this error, this is what the console prints:

********** CHECKING PING
************ CONNECTION STILL ACTIVE
[mysql] 2016/10/11 11:57:27 packets.go:33: unexpected EOF
********** CHECKING PING
************ CONNECTION STILL ACTIVE
dongtuan5367
dongtuan5367 您是否尝试将空闲连接数设置为0?
3 年多之前 回复
doulei2100
doulei2100 我遇到了相同的错误:[mysql]2017/02/0816:31:56packets.go:33:意外的EOF[mysql]2017/02/0816:31:56packets.go:130:写了tcp127.0。0.1:49188->127.0.0.1:3306:写入:管道断开-在10小时内没有请求发送到服务器后发生了此错误。不确定是否与github.com/go-sql-driver/mysql/issues/257相关
3 年多之前 回复
dongnong3019
dongnong3019 我的代码唯一要做的就是调用connection.QueryRow并传入查询字符串。而已。有时会引发错误,而其他时候则不会。该错误在QueryRow函数中出现,因为我在将行扫描到结构之前和之后都打印出了东西。这没有任何意义。但是,这实际上就是我正在做的。而且,如果我没有正确使用sql.DB,则可以了解如何更新代码。
接近 4 年之前 回复
dpp42324
dpp42324 您尚未显示任何与数据库交互的代码,因此,如果没有一个最小的可复制示例,我们将无能为力。
接近 4 年之前 回复
duanli0453
duanli0453 您建议对我的代码进行哪些更新?
接近 4 年之前 回复
doujian1050
doujian1050 sql.Open返回一个*sql.DB,它是一个连接池,您的连接变量与单个TCP连接不对应。
接近 4 年之前 回复
dongxingdu9594
dongxingdu9594 看看我的最新编辑。我添加了一些Println,并在收到该错误时查看控制台输出。这让我更加困惑,因为这表示我的连接一直都处于活动状态。
接近 4 年之前 回复
dongshai1944
dongshai1944 对,那是正确的。我的代码没有错误。除了我的初始编辑,我还添加了SetMaxOpenConns(10),它仍然给我错误。
接近 4 年之前 回复
drlnsli18864734
drlnsli18864734 抱歉,我假设您发布的日志行来自您的代码。您是说代码中没有错误,而这只是被记录下来了?那么分配全局连接的原始修补程序可能已经解决了您的问题,因为sql.Open仅应调用一次。服务器由于某种原因关闭连接,可能是因为您打开的端口太多。您还应该使用SetMaxOpenConns设置合理的限制
接近 4 年之前 回复
dongling2038
dongling2038 查看我的编辑。这行得通吗?使用connection.Ping()检查连接是否仍然有效,并且如果引发错误,则重置连接?
接近 4 年之前 回复
douzhan1935
douzhan1935 我不知道“mc.buf.readNext”是什么。那不是我的代码,它在mysql包中。
接近 4 年之前 回复
douju6752
douju6752 暂时此消息有什么困难吗?或者,如果连接提前关闭并发出db请求,它是否抛出该错误并只是打开备份?
接近 4 年之前 回复
dongliang1996
dongliang1996 那么,错误来自mc.buf.readNext,那是什么?在这里有一个完整的例子确实有帮助。连接过早关闭,或者由于某些原因数据短于您的预期。因为您说的是随机的,所以我猜它是以前的。对于“随机”问题,您应该做的另一件事是确保您使用种族探测器进行测试。
接近 4 年之前 回复
dragonlew9876
dragonlew9876 我什至没有抓住。我已编辑。
接近 4 年之前 回复
dtwk6019
dtwk6019 错误的原因不在您发布的代码中,但是GetConnection永远不会为全局连接变量分配值。应该吗?
接近 4 年之前 回复
dqbjvg2518
dqbjvg2518 您的打印错误显示为packets.go:33:意外的EOF,packets.go中的第33行是什么?
接近 4 年之前 回复

1个回答



类似于 github问题提供了此修复程序。 至少对于我来说,此修复程序是将 MaxIdleConnections </ strong>设置为0。我将服务器保持24小时正常运行,每隔几个小时对它运行一次查询,但尚未重现该错误。</ p >

感谢@city提供链接。</ p>
</ div>

展开原文

原文

Looks like the link to the github issue provided the fix. The fix, at least for my situation was setting the MaxIdleConnections to 0. I have kept a server up for 24 hours, running queries against it every several hours and have yet to reproduce the error.

Thanks to @city for the link.

douzhongpi9734
douzhongpi9734 我们拥有的最佳解决方案是禁用池? 我对此不满意。 一旦发现更好的地方,我将进行更新。
大约一年之前 回复
douran6443
douran6443 我也遇到同样的错误。 但是将MaxIdleConnections设置为0对我不起作用。 https://stackoverflow.com/questions/47406876/unexpected-eof-and-busy-buffer-in-go-sql-driver-mysql-packets-go
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问