mysql:9640
From: "Kageyama Takahiro" <"Kageyama Takahiro" <kageyama329@xxxxxxxxxx>>
Date: Mon, 14 Jun 2004 20:23:36 +0900
Subject: [mysql 09640] Insert 毎に接続・切断を繰り返すと不特定な場所でエラーが発生する。
初めまして、かげやまと申します。
書き込みをする度に接続・切断という処理を繰り返し行うと、何回目かでエラーに
なる問題が発生しました。毎回違う回数でエラーになります。
どうしたら発生しないようでできますでしょうか?
以下に、環境・再現方法・エラーメッセージの順番で説明します。
・環境:WindowsXP HomeEdition
        MySQL(4.0.15)
        JDBC Driver(mysql-connector-java-3.0.7-stable-bin.jar)
        両方とも同一 PC で稼動しています。
・再現方法:以下の Test.java をコンパイルして、test.bat を実行します。
            ドライバー・クラスファイル・バッチファイルは全て同一ディレクトリ
に
            置いてください。
-------------------------------- test.bat 
-------------------------------------
java -classpath .;.\mysql-connector-java-3.0.7-stable-bin.jar Test
-------------------------------- Test.java 
------------------------------------
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
class Test {
  private static final String CREATE_QUERY = "CREATE TABLE IF NOT EXISTS 
test"+
                                             " ( ip VARCHAR(255) PRIMARY 
KEY)";
  private static final String INSERT_QUERY="INSERT INTO test (ip) VALUES 
(?);";
  private static final String FLUSH_QUERY = "FLUSH TABLES;";
  public static void main(String[] args) {
    try {
      loadMysqlDriver();
      createTable();
      loop();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
  static void loadMysqlDriver() {
    try {
      Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }
  static Connection getNewConnection() throws SQLException {
    Properties info = new Properties();
    info.setProperty("user", "");
    info.setProperty("password", "");
    info.setProperty("useUnicode", "true");
    info.setProperty("characterEncoding", "shift_jis");
    return DriverManager.getConnection("jdbc:mysql://localhost/test", 
info);
  }
  static void createTable() throws SQLException {
    Connection conn = null;
    PreparedStatement pstmt = null;
    try {
      conn = getNewConnection();
      pstmt = conn.prepareStatement(CREATE_QUERY);
      pstmt.executeUpdate();
    } finally {
      if (pstmt != null) {
        pstmt.close();
      }
      if (conn != null) {
        conn.close();
      }
    }
  }
  static void loop() throws SQLException {
    String COMMA = ".";
    for (int i = 0; i < 256; i++) {
      for (int j = 0; j < 256; j++) {
        for (int k = 0; k < 256; k++) {
          for (int l = 0; l < 256; l++) {
            StringBuffer buf = new StringBuffer();
            buf.append(i).append(COMMA).append(j).append(COMMA);
            buf.append(k).append(COMMA).append(l);
            String ip = buf.toString();
            System.out.println("ip = " + ip);
            insert(ip);
          }
          showStatus();
        }
      }
    }
  }
  static void insert(String ip) throws SQLException {
    Connection conn = null;
    PreparedStatement pstmt = null;
    try {
      conn = getNewConnection();
      pstmt = conn.prepareStatement(INSERT_QUERY);
      pstmt.setString(1, ip);
      pstmt.executeUpdate();
    } finally {
      if (pstmt != null) {
        pstmt.close();
      }
      if (conn != null) {
        conn.close();
      }
    }
  }
  static void showStatus() throws SQLException {
    String TYPE = "Threads_connected";
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet result = null;
    try {
      conn = getNewConnection();
      pstmt = conn.prepareStatement("show status;");
      result = pstmt.executeQuery();
      while (result.next()) {
        String key = result.getString(1);
        if (TYPE.equals(key)) {
          System.out.println("接続数 = " + result.getString(2));
          break;
        }
      }
    } finally {
      if (result != null) {
        result.close();
      }
      if (pstmt != null) {
        pstmt.close();
      }
      if (conn != null) {
        conn.close();
      }
    }
  }
}
・エラーメッセージ
ip = 0.0.0.0
ip = 0.0.0.1
ip = 0.0.0.2
     ・
     ・
     ・
     ・
ip = 0.0.15.103
ip = 0.0.15.104
java.sql.SQLException: Unable to connect to any hosts due to exception: 
java.net.BindException: Address already in use: connect
        at com.mysql.jdbc.Connection.createNewIO(Connection.java:1592)
        at com.mysql.jdbc.Connection.<init>(Connection.java:486)
        at 
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java
:326)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at Test.getNewConnection(Test.java:37)
        at Test.insert(Test.java:77)
        at Test.loop(Test.java:66)
        at Test.main(Test.java:19)
以上です。
_________________________________________________________________
メッセンジャーで総額1億円プレゼント! http://im.msn.co.jp/home.htm 
-> 9640 2004-06-14 20:23 ["Kageyama Takahiro" ] Insert 毎に接続・切断を繰り返すと不特定な場所でエラーが発生する。 9641 2004-06-14 20:59 ┣[ML account <ml@xxxxx] 9642 2004-06-14 21:31 ┣["Haruki Nakayama" <h] 9645 2004-06-15 10:24 ┃┗[Murayama Toshikiyo <] 9643 2004-06-14 23:42 ┣[<oouchi@xxxxxxxxxx> ] 9644 2004-06-15 00:01 ┃┗[<oouchi@xxxxxxxxxx> ] 9651 2004-06-15 18:21 ┗[<yasuyuki@xxxxxxxxxx] 9652 2004-06-15 19:00 ┣["HIROSE, Masaaki" <h] 9654 2004-06-15 19:29 ┃┗[ML account <ml@xxxxx] 9658 2004-06-16 01:47 ┃ ┗["HIROSE, Masaaki" <h] 9655 2004-06-15 19:42 ┗[seiji takegata <take]