[前][次][番号順一覧][スレッド一覧]

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]