2016-07-19 4 views
0

githubからのクロス・ポスト。xormとgo-mysqlによる接続プーリング

xorm 0.4.3をgo-mysqlと使用しています。私たちはGolang 1.4を利用しています。

私たちは以下のようにxormmaxIdleConnetionsmaxOpenConnectionsを指定している: -

var orm *xorm.Engine 
... 
orm.SetMaxOpenConns(50) 
orm.SetMaxIdleConns(5) 

をそして、我々は、MySQLのクエリに同じ単一xormインスタンスを使用しています。

しかし、我々lsofときまだ我々は、私はmaxIdleConnetionsmaxOpenConnections状態に設定した数値以上の方法であるTCP Connection Establised状態での接続の多くを見ている: -

app 8747 10568 sandeshsharma 16u IPv4 691032 0t0 TCP 127.0.0.1:57337->127.0.0.1:mysql (ESTABLISHED) 

我々は、我々が停止する場合でも、ということも観察されていますMySQLでは、接続番号はまだ固定されているが、CLOSED_WAITの状態にある。アプリケーションをシャットダウンすると、すべての接続が終了します。

app 8747 10844 sandeshsharma 38u IPv4 505058 0t0 TCP 127.0.0.1:54160->127.0.0.1:mysql (CLOSE_WAIT) 

しかしMySQLのプロセスのリストにそれは私がmaxIdleConnetionsmaxOpenConnectionsに指定されているような接続の正しい数を示しています。

この動作を教えてください。それぞれmaxIdleConnetionsmaxOpenConnections〜5 & 50と指定しても、なぜTCP接続を監視していますか?

答えて

1

まず、Go 1.4は古すぎます。最新のGo 1.6を使用してください。 この回答はGo 1.6の知識で書かれています。あなたの場合、いくつかの詳細が異なる場合があります。

接続には4つの状態があります:接続、アイドル、インサーズ、クローズです。 MaxOpenConnectionsは、接続中、アイドル中、使用中の状態での接続数を制限します。 したがって、アプリケーションがすぐに接続を閉じて再オープンすると、それが起こる可能性があります。

MySQLサーバ側でTCPがCLOSED_WAITの状態なので、あなたのアプリは接続からEOFを待っています。私はあなたのアプリが非常に高い負荷 の下にあり、EOFを読んで接続を閉じるのが遅いと思います。 EOFを読み、接続を閉じるまで、サーバ側のTCP状態に関係なく、クライアント側でTCP状態がESTABLISHEDになります。

Goと「go-sql-driver/mysql」を更新し、MaxIdleConnsをMaxOpenConnsに設定して再接続率を高くすることをお勧めします。 代わりに、SetConnMaxLifetime(Go 1.6の新しいAPI)を使用して、アイドル時に の接続を閉じることができます。

+0

はい、これは、アプリの負荷が高いときにのみ表示されます。しかし、私が疑問に思っているのは、maxOpenConnectionsを50に指定しているにもかかわらずです。しかし負荷がかかっていると、私は自分の質問に投稿したように、ESTABLISHED状態でも50以上のオープン接続を見ています。しかし、mysqlのプロセスリストには50が表示されています。なぜこれが起こっていますか? – tuk

+1

あなたのアプリはCOM_CLOSEパケットをMySQLに送信します。 MySQLは接続を閉じます。 しかし、あなたのアプリはEOFをまだ読んでいません。 アプリケーションがEOFを読み取るまで、TCP接続はESTABLISHED状態で有効です。 あなたのアプリは負荷が高いので、あなたのアプリはすぐにEOFを読むことができません。 – methane

+0

あなたのコメントをコメントで更新できますか? 1つの最後のクエリで、 'maxIdleConnections'を' maxOpenConnection'に設定すると、どのように役立ちますか? – tuk

関連する問題