マクロミルアンケートモニタ
200万人が参加のアンケートサイト! 楽しく!簡単に!ポイントが貯まる! 貯めたポイントはお小遣いに♪
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
バッチ系 JAVAコンソールアプリケーションで、MySQLにアクセスしていたのだけど 短時間に接続 / 切断をしていると エラーが発生して、接続が出来なくなることがある java.net.SocketException MESSAGE: java.net.BindException: Address already in use: connect 理由は、MySQLへのTCPコネクションが、更新クエリ発行毎に張られてしまいポート番号が実行環境(WindowsXP)で使い切ってしまった為。 ポート番号は、65534まであるが、Windowsのデフォルトは5000までとなっているらしい。 また、アプリから更新クエリ終了後close処理をしても、TCPコネクションはTIME_WAITの状態をキープする。 ※参考 http://www.mysql.gr.jp/mysqlml/mysql/msg/9648 より一部抜粋。
Windows2000(そしてXPもだと思いますが)には、ポートが足りなくなった場合に、 TIME_WAITに遷移してから60秒以上経過した接続を強制的にCLOSEDの状態へ遷移させる (つまりポートを空ける) 緊急クリーンアップの機能を持っていますし、短時間に大量の接続/切断を繰り返すのは プログラミング的にアウチですから、通常はあまりポートが足りなくなってエラーが発生する事はありません。 けれども、MSのTCP/IP関係のレジストリ設定を変更するして (例えば、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parametersで、MaxFreeTWTCBsを6000、MaxUserPortを5000とするとか)、 短時間に大量の接続/切断を繰り返すと、ポートが足りなくてエラーが出る状態を作りだす事が出来ます。
同じような現象が起きている人のブログを見つけたので記載 http://powerdee.com/it/trouble/addressInUse.html コネクションを取得し、 stmt.addBatch(); int result[] = stmt.executeBatch(); でトランザクションを実行するばなんとかなるようです
[0回]