2015-04-15 1 views
1

В моем веб-приложении java я подключаюсь к локальной базе данных MySQL. Используя сервлет, я беру csv-файл и вставляю данные в базу данных. Он прекрасно соединяется и вставляет данные, но он начинает прогрессивно замедляться после каждой вставки, сделанной из файла csv. Когда он получает до строки 159 в файле CSV он выдает это исключение:threw exception [com.mysql.jdbc.CommunicationsException: Ошибка связи связи из-за основного исключения:

выбросил исключение

[com.mysql.jdbc.CommunicationsException: Связь отказ ссылки в связи с основным исключением:

java.net.SocketException СООБЩЕНИЕ: Разрешение отказано: подключение

StackTrace:

java.net.SocketException: Разрешение отказано: подключение

Кто-нибудь знает, почему это будет работать нормально, а затем замедлить до тех пор, пока не бросает это исключение? Я действительно почесываю голову об этом, и ничто в Интернете, похоже, не помогает. Кстати, я использую tomcat8.

+1

Вы повторно используете свои соединения, закрывая их или просто оставляя их в памяти. –

+0

Я думаю, что @ScaryWombat находится на отметке, q.v. [этот пост] (http://stackoverflow.com/questions/6865538/solving-a-communications-link-failure-with-jdbc-and-mysql). Попробуйте перезагрузить свой MySQL. Если это устраняет проблему, у вас, вероятно, проблема с пулом соединений. –

+0

Я думаю, что вы правы, количество соединений растет, когда я запускаю программу, и они, похоже, не закрываются. Я вызываю connection.close() после ввода вставки, но это, похоже, не закрывает соединение. Почему они не закрываются, если я вызываю connection.close()? – Stryker

ответ

1

Поскольку вы уже обнаружили исключение, которое вы получаете, возникает причина, по которой вы открываете так много соединений, что предел достигнут.

Для правильного закрытия соединений с db есть в основном три шага.

  1. Закрыть ResultSet (если есть)
  2. Закрыть Заявление объекта
  3. Закрыть Подключение объекта

Типичный код что-то вроде следующего:

try { 
    //your code that is making and using jdbc is here 

    //after you finish 
    rs.close(); //if a ResultSet was returned 
    stmt.close(); //Close Statement 
    conn.close(); //Close Connection 
}catch(SQLException se){ 
}catch(Exception e){ 
}finally{ 
    //finally block used to close resources if Closing failed above 
    try{ 
     if(stmt!=null) 
      stmt.close(); 
    }catch(SQLException se2){ 
    }// nothing we can do 
    try{ 
     if(conn!=null) 
      conn.close(); 
    }catch(SQLException se){ 
     se.printStackTrace(); 
    }//end finally try 
}//end try 

Для полного пример см. this