我将整个代码库从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
}
这个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
}
}
}
第一个&#34; errLog.Print(错误)&#34;是&#34;读包标题中的第33行&#34;部分。
非常感谢任何帮助!
我在连接包中添加了一些log.Println并让进程运行,就在我收到此错误的地方,这就是控制台打印的内容:
********** CHECKING PING
************ CONNECTION STILL ACTIVE
[mysql] 2016/10/11 11:57:27 packets.go:33: unexpected EOF
********** CHECKING PING
************ CONNECTION STILL ACTIVE
答案 0 :(得分:2)
看起来github issue的链接提供了修复程序。修复,至少在我的情况下是将 MaxIdleConnections 设置为0.我已经将服务器保持24小时,每隔几个小时对它运行一次查询并且还没有重现错误。
感谢@city的链接。
答案 1 :(得分:0)
DSN添加了net_write_timeout选项
root:root@tcp(localhost:3306)/prod?net_write_timeout=6000
答案 2 :(得分:0)
import (
"database/sql"
"time"
)
//..snip...
db, err = sql.Open("mysql", url)
db.SetConnMaxLifetime(time.Minute * 4) // <-- this
为我做了。说明:here