我将整个代码库从PHP切换到Go,在运行的多个过程中,我随机遇到此错误:
[mysql] 2016/10/11 09:17:16 packets.go:33: unexpected EOF
这是我的db软件包,用于处理与数据库的所有连接:
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 }
我对此数据库包做错了什么,导致引发了此错误?该错误的确切含义是什么?如果打开了一个连接,我确保返回当前连接,因此对于多个请求,它使用同一连接对象。
这是mysql packet.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)”是“读取数据包头”部分中的第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问题的链接提供了此修复程序。至少对于我来说,此修复程序是将 MaxIdleConnections 设置为0。我已将服务器保持24小时的运行状态,每隔几个小时对它运行一次查询,但尚未重现该错误。
感谢@city提供链接。