2017-02-09 4 views
0

私はGoにデータを格納するためにmysqlを使用する小さなWebアプリケーションを作成しています。私はgithubの(issue 529issue 257issue 446にいくつかの関連の議論を見つけたmysql接続のタイムアウトに最適なソリューションは何ですか?

[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 

:ウェブサーバは、ある程度の時間の後に任意の要求(> 8時間)を取得していない場合

私は断続的なMySQLのエラーを得ました)。私が理解していることから、タイムアウトに達すると、mysql dbは接続を閉じます。

SetMaxOpenConnsを9に、SetMaxIdleConnsを0に設定しようとしました。しかし、これはすぐに例外を投げた。 (ただし、SetMaxIdleConnsを0より大きく設定すると、すぐに例外がスローされませんでした)

また、SetConnMaxLifetimeを5分に設定しようとしました。これは5分後にも例外を投げた。

今私は以下のコードをしようとしています:

db.SetConnMaxLifetime(0) 
db.SetMaxOpenConns(10) 
db.SetMaxIdleConns(5) 

をそれが20分間実行されています。まだ教えるのは時期尚早です。

  • ドライバ:行く-SQLドライバV1.3(UPDATE:これはどちらか動作しません)

    ここでは、コンフィギュレーションです。

  • 行くバージョン:go1.7.1ダーウィン/ AMD64
  • のmysql:latest from docker hub
  • RKTバージョン:1.18
  • CoreOS:1284.0.0

答えて

1

おそらく、あなたはタイムアウトを避けるために、ハートビートゴルーチンを開始することができます。

+0

'{db.ping()}'はハートビートのゴルーチンとして十分でしょうか? – city

+0

または多分{{{db.Exec( "DO 42")}} 'の提案は、https://github.com/go-sql-driver/mysql/issues/498で提案された方が良いでしょう。 – city

+1

ティッカー、できるだけ早くそれをpingする必要はありません。 – Adrian

関連する問題