问题
I am writing a small web app in Go, which uses mysql to store data.
I got intermittent mysql error if the web sever didn't get any request after some amount of time(> 8 hours):
[mysql] 2017/02/08 16:31:56 packets.go:33: unexpected EOF
[mysql] 2017/02/08 16:31:56 packets.go:130: write tcp 127.0.0.1:49188->127.0.0.1:3306: write: broken pipe
I found some related discussion on github(issue 529, issue 257 and issue 446). From what I understand, mysql db would close the connection if timeout is reached.
I tried to set SetMaxOpenConns
to 9 and SetMaxIdleConns
to 0 as some people recommended. However, this threw exception immediately. (But if I set SetMaxIdleConns
larger than 0, there was no immediate exception thrown)
I also tried to set SetConnMaxLifetime
to 5 mins. This threw exception too after 5 mins.
Now I am trying the code below:
db.SetConnMaxLifetime(0)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(5)
It has been running for 20 mins. It's still too early to tell. (UPDATE: this doesn't work either)
Here is configuration:
- driver: go-sql-driver V1.3.
- go version: go1.7.1 darwin/amd64
- mysql: latest from docker hub
- rkt version: 1.18
- CoreOS: 1284.0.0
回答1:
Perhaps you can start a heartbeat Goroutine to avoid timeout.
回答2:
you can check your mysql time_wait variable:
mysql> show global variables like 'wait_timeout': +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout | 300 | +---------------+-------+ 1 row in set (0.00 sec)
then use
db.SetConnMaxLifetime(120*time.Second)
, which mean when db connection is idle over than 120s, sql.db will reopen or get a new connection from db pool bydb.Open
. If you not set connection max life time, you maybe use a closed connection and got the error.watching the mysql process list,
mysql> show processlist;
,if connection sleep over than 300s,it's recycled by mysql:mysql> show processlist; +-------+-----------------+------------------+-------------+---------+---------+------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +-------+-----------------+------------------+-------------+---------+---------+------------------------+------------------+ | 4 | event_scheduler | localhost | NULL | Daemon | 1363480 | Waiting on empty queue | NULL | | 26539 | root | 172.17.0.1:48732 | NULL | Query | 0 | starting | show processlist | | 26575 | auditcenter | 172.17.0.1:51714 | obs_gb_test | Sleep | 51 | | NULL | +-------+-----------------+------------------+-------------+---------+---------+------------------------+------------------+ 3 rows in set (0.00 sec)
SetMaxOpenConns
andSetMaxIdleConns
is used for setting connection resource, see enter link description here
来源:https://stackoverflow.com/questions/42127441/what-is-the-best-solutions-to-mysql-connection-timeout