MySQLとC#で通信すると接続が切れる。


MySQL5.5.15とC#で開発しています。
10000個のテーブルに一つずつデータを書き込みたいと思っています。
MySqlCommand cmd = new MySqlCommand("insert ~", conn);
cmd.ExecuteNonQuery();
上記コードを10000回走らせています。

ですが、かなりの頻度で「接続が予期せず閉じられました」と途中で止まってしまいます。
それぞれテーブルが違うのでまとめてクエリを送信することもできず、またオートコミットをOFFにして100クエリずつcommitしましたが症状は改善されませんでした。
またたまに成功したとしても20秒ほどかかりとても遅いのではないかと思います。

どうすれば改善できますか。よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2011/08/19 19:38:19
  • 終了:2011/08/26 19:40:05

回答(1件)

id:Jupiter2100 No.1

じゅぴたー回答回数444ベストアンサー獲得回数742011/08/19 21:24:49

ポイント100pt

>20秒ほどかかりとても遅いのではないかと思います。

そんなことはありません。

1台のPCで1万個のテーブル相手に書き込みをしようとすると、分単位の時間はかかります。

最適化の必要があると思いますが、その前に確認です。

ループ処理は以下のようにopen/closeを繰り返していますか?


MySqlCommand cmd = new MySqlCommand("insert ~", conn);
myConnection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
id:after_333sec

ご回答ありがとうございます。

一つのテーブルに10000レコードと、10000個のテーブルに一つずつでは全く違うのですね。

open/closeは最初と最後の一回のみです。

2011/08/19 21:47:36
  • id:cx20
    処理を2段階に分けてみては如何でしょうか?
    1. 中間テーブル(一次テーブル)にバルクインサートで10000レコード登録する。
    2. MySQL側のストアドプロシージャ(中間テーブル→各テーブルへ登録するプログラム)を呼び出す。

    バルクインサートは複数レコードを一回のINSERTで行うMySQL独自の機能で、割とパフォーマンスが良いそうです(使ったことはないですが。。。)

    <参考情報>
    ■ MySQL/チューニング - ピノキヲ IT Wiki
    http://pinoki.la.coocan.jp/wiki/?MySQL%2F%A5%C1%A5%E5%A1%BC%A5%CB%A5%F3%A5%B0
  • id:Jupiter2100
    >open/closeは最初と最後の一回のみです。
    これはいけません。
    newでスレッドが作られ続けますから、おそらくそれが停止の原因になっているのだと思います。
    いちいちopen/closeすると時間はかかりますが、それでどこまで行けるかお試しください。
  • id:after_333sec
    >cx20さん
    ご回答ありがとうございます。残念ながらMySQLには違うテーブルに対するバルクインサート機能はないようです。

    >じゅぴたーさん
    10000テーブルに1つずつデータを入れるという作業を数回繰り返す必要があります。
    10回あたりまでは接続が切れないようになりました。しかしそのあとやはり同じエラーが出てしまいます。
  • id:khazad-Lefty
    切り分けのポイントとして
    Mysqlのエラーログ
    http://dev.mysql.com/doc/refman/4.1/ja/error-log.html
    あたりを確認して、DB側でエラーが発生していないかを確認するとか
    動作中のメモリ使用量を確認して不自然なメモリ使用量の増加がないかどうかをみるとか。
    あと、DBサーバーとアプリケーションサーバーは同一のPCでしょうか?
    接続方法はどうなっているでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません