githubからのクロス・ポスト。xormとgo-mysqlによる接続プーリング
xorm 0.4.3をgo-mysqlと使用しています。私たちはGolang 1.4を利用しています。
私たちは以下のようにxorm
にmaxIdleConnetions
とmaxOpenConnections
を指定している: -
var orm *xorm.Engine
...
orm.SetMaxOpenConns(50)
orm.SetMaxIdleConns(5)
をそして、我々は、MySQLのクエリに同じ単一xorm
インスタンスを使用しています。
しかし、我々lsof
ときまだ我々は、私はmaxIdleConnetions
とmaxOpenConnections
状態に設定した数値以上の方法である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のプロセスのリストにそれは私がmaxIdleConnetions
とmaxOpenConnections
に指定されているような接続の正しい数を示しています。
この動作を教えてください。それぞれmaxIdleConnetions
とmaxOpenConnections
〜5 & 50と指定しても、なぜTCP接続を監視していますか?
はい、これは、アプリの負荷が高いときにのみ表示されます。しかし、私が疑問に思っているのは、maxOpenConnectionsを50に指定しているにもかかわらずです。しかし負荷がかかっていると、私は自分の質問に投稿したように、ESTABLISHED状態でも50以上のオープン接続を見ています。しかし、mysqlのプロセスリストには50が表示されています。なぜこれが起こっていますか? – tuk
あなたのアプリはCOM_CLOSEパケットをMySQLに送信します。 MySQLは接続を閉じます。 しかし、あなたのアプリはEOFをまだ読んでいません。 アプリケーションがEOFを読み取るまで、TCP接続はESTABLISHED状態で有効です。 あなたのアプリは負荷が高いので、あなたのアプリはすぐにEOFを読むことができません。 – methane
あなたのコメントをコメントで更新できますか? 1つの最後のクエリで、 'maxIdleConnections'を' maxOpenConnection'に設定すると、どのように役立ちますか? – tuk