mysql:9647
From: UNO Shintaro <UNO Shintaro <uno@xxxxxxxxxx>>
Date: Tue, 15 Jun 2004 12:57:15 +0900
Subject: [mysql 09647] Re: Insert 毎に接続・切断を繰り返すと不特定な場所でエラーが発生する。
>> > 書き込みをする度に接続・切断という処理を繰り返し行うと、何回目かでエラー >に >> > なる問題が発生しました。毎回違う回数でエラーになります。 >> >> エラーが発生した直後にDOS窓で"netstat"を実行するとどうなるでしょう?異 >>様に長いリストが表示されませんか? > >はい、以下のように非常に長いリストが表示されます。 >コネクトする度に Local Address に連番が >振られているようですが、これは一体何なのでしょうか? それはクライアント側のTCP/IPのポート番号です。TCP/IPの基礎なので、 詳しくはTCP/IPについての書籍等で学んでいただくと良いのですが。 とりあえず、結論と、大まかな説明をします。 結論は、1クライアントから大量の接続・切断を短時間のうちに繰り返しては ダメだってことです。1回の接続をなるべく使いまわすようにしましょう。 かげやまさんが示された class Test の場合、最初に1回接続して、その接続 を使って全てのDB処理を行なうように変更することは可能だと思います。 次に、おおまかな説明です。 TCP/IPでの接続の際、クライアント側でもサーバ側と同様、ポートを1つ占有 します。ポートにはポート番号という識別子がついています。 ■TIME_WAITについて 1回使って済んだポートは、再び使えるようになるまでにしばらく待ち時間が あります。この時間待ち状態になっているポートはnetstatでTIME_WAITとして 表示されます。 ■ポート番号について 本来、クライアントもサーバと同様、接続時に自分が使うポート番号を自分で 指定します。 ですが、クライアント側のポート番号をクライアントアプリケーションが固定 で指定すると、同じアプリケーションを、同じマシンで複数同時に使うことが できません(占有なので)。 これでは不便なので、クライアントに自動でポート番号を割り当てる仕組みが 設けられていて、普通クライアントはそれで割り当てられた番号を使います。 (netstatでポートが連番で見えるのは、自動採番のポートだからです。) ■接続・切断を繰り返したときの影響について クライアントアプリケーションがTCP/IPで接続・切断をするごとに、自動採番 で次々にポートが使い捨てられてTIME_WAIT状態になります。使い捨てられた ポートは、時間がたつとTIME_WAIT状態から復帰してまた接続に使えるように なります。 ポートは有限な資源なので、短時間のうちに接続・切断を大量に繰り返すと、 使い捨てられたポートのTIME_WAIT状態からの復帰が間に合わず、使用可能な ポートが取得できなくなって(詳細は端折ります)、接続エラーが起きます。 かげやまさんのnetstatの表示は、この現象が起きていることを示しています。 -- UNO Shintaro, 宇野 信太郎 mailto:uno@xxxxxxxxxx http://www.venus.dti.ne.jp/~uno/
9646 2004-06-15 10:37 ["Kageyama Takahiro" ] Re: Insert 毎に接続・切断を繰り返すと不特定な場所でエラーが発生する。 -> 9647 2004-06-15 12:57 ┣[UNO Shintaro <uno@xx] 9648 2004-06-15 13:16 ┗[ML account <ml@xxxxx] 9649 2004-06-15 17:49 ┗[深海水草 <VYG01106@x] 9650 2004-06-15 18:00 ┗[<yasuyuki@xxxxxxxxxx]