2

MySQL: Using Connector/Net with Connection Poolingについて読んでいました。グローバルMySqlConnectionオブジェクトを使用せず、手動で開閉することをお勧めします。さらに、オブジェクトを操作するMySqlHelper代わりにを使用することをお勧めしMySqlCommandます。

したがって、CONNECTION_STRINGセットアップがあると仮定すると、次のようなことができます。

MySqlHelper.ExecuteNonQuery(CONNECTION_STRING,
    @"INSERT INTO `table1` (`col3`,`col4`) VALUES (@col3, @col4 );",
    (new List<MySqlParameter>() {
                new MySqlParameter("@col3", @"another value"),
                new MySqlParameter("@col4", @"some value")    
            }).ToArray()
    );

ここで、(TPL を介して) 非同期並列タスクで上記の呼び出しを数千回行ったとします。

私のMySQLサーバーにはいくつかの最大接続が許可されており、ユーザーが最大接続を超えたと主張する例外がスローされ始めました。接続プーリングがこれを自動的に処理するはずだと思いましたか? ドライバーは、それらを自動的にプールしてキューに入れることを想定していませんか?

現在許可されている最大接続数は 1500 で、これを接続文字列に追加しました。

Pooling=True;minimumPoolSize=0;maximumpoolsize=100;

それでも、まだ最大接続数を超えています。この最大接続制限を爆発させずに多くの非同期挿入を処理する方法についてアドバイスが必要です。

4

1 に答える 1

3

に加えてmax_connectionsmax_user_connectionsがここで重要です。次のクエリを実行できます。

show variables like 'max_user_connections';

MySQL ユーザーの最大接続数を超えないようにするには、maximumpoolsize(接続文字列内の) がそれよりも低い値に設定されていること、max_user_connectionsおよび他のアプリが、合計が上限を超える可能性がある同じユーザー アカウントとの接続を開いていないことを確認する必要があります。たとえば、上限が 15 の場合、私の場合は 5 に設定できます。

これをキャッピングすることは、使用しているリソースを制限するために、ほとんどのホスティング サービスで非常に一般的です。

単一の接続でより大きなクエリのバッチを実行することも、実行可能な回避策になる可能性があります。

さらに、ホストの制限max_queries_per_hourやその他の変数もあります。

于 2012-10-16T17:31:46.640 に答える