Не удается прочитать ответ с сервера

Я написал программу Java, и программа подключается к базе данных на моем сервере, для поиска записей, записи записей, обновления и удаления. по какой-то причине поиск записей работает, но большую часть времени, когда я пытаюсь сохранить или записать запись, появляется сообщение об ошибке:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 9,787 milliseconds ago.       The last packet sent successfully to the server was 8,183 milliseconds ago.

Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2552)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3002)
... 46 more

Может ли кто-нибудь объяснить, почему это происходит? Обычно это дает мне сообщение об ошибке при попытке добавить запись после того, как у меня было программное обеспечение, работающее более чем на полминуты. похоже, что-то потеряет связь. когда я запускаю программу и быстро записываю новую запись, она работает

Ответ 1

У меня была такая же проблема. Я упомянул много сообщений и комментариев, но работа для меня изменила некоторые параметры файла my.cnf. Надеюсь, это тоже поможет вам.

Задайте следующие параметры в разделе my.cnf [mysqld]

interactive_timeout=180 # "No.of sec. a server waits for activity on interactive connection before closing it"

wait_timeout=180 # "No. of sec. a server waits for an activity on a connection before closing it"

max_connect_errors=9999 # "More than this number of interrupted connections from a host this host will be blocked from further connections"

skip-name-resolve # "Don't resolved host names. All host names are IP's"

Ответ 2

Иногда эта проблема возникает из-за размера оперативной памяти системы. Может быть, вы вставляете данные, используя буфер через ОЗУ. Чтобы избавиться от этой проблемы.

  • Перед установкой данных установите автоматическое отключение.
  • вставьте некоторое количество данных, соответствующих вашей системной памяти (не целом).
  • Завершите запрос.
  • Повторите шаги 2 и 3 до тех пор, пока вся вставка не будет сделал.

Это можно понять по следующему коду.

public static void main(string args[]) 
{
  Connection con = null;
  Statement stm = null;
  int i;
  float ratio;
  ratio=1.0f;
  try
  {
    Class.forName("com.mysql.jdbc.Driver");
    // Connecting to the database
    con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/demo",
                                      "ashish", "impetus");
    File f = new File("filler"); // taking the random text data from the file
                                 // filler.txt and inserting that string
                                 // in filler field of the relations
    RandomAccessFile r = new RandomAccessFile(f,"r");
    Random randomGenerator = new Random();
    String strLine=new String();
    int r1,flag=0;
    stm = con.createStatement();
    con.setAutoCommit(false) ;

    int k=0;
    i=0;                

    long sum2=0;
    while(k%50000==0)
    {
      final long start = currentTimeMillis();
      final StringBuilder builder =
        new StringBuilder("INSERT INTO accounts 
                           (aid, bid,abalance,filler) VALUES ");
      while(i!=naccounts*ratio*scale )
        {
        int j=i+1;
        for(int l=0;l<40;l++)
        {
          strLine+=((char)r.read());
          r.skipBytes(0);
        }
        r1=randomGenerator.nextInt(1500);
        if(strLine.equals(""))
        {
          flag=1;
        }
        if(flag!=1)
        {   
          strLine=strLine.replaceAll("\\s","");
          strLine=strLine.replaceAll("\\t","");
        }                   
        flag=0;
        if (i%50000!=0) 
        {
          builder.append(",");
        }
        builder.append(format("(%s, %s, %s, '%s')", j, 
                       i/naccounts+1, 0, strLine));
        strLine="";
        r.seek(r1);
        i++;
        if(i%50000==0||i>=naccounts*ratio*scale)
        {   
          final String query = builder.toString();
          final PreparedStatement statement1 = con.prepareStatement(query);
          statement1.execute();
          con.commit();
          final long stop= currentTimeMillis();
          sum2=sum2+(stop-start);
          statement1.close();
        }
        if(i%50000==0||i>=naccounts*ratio*scale)
        {
          break;
        }
      }
      k=k+50000;
      if(k>naccounts*ratio*scale)
      {
        break;
      }
    }
    System.out.println(i+" rows inserted accounts table ");
    System.out.println("time taken = "+sum2+" milliseconds");
  }
  catch (SQLException e)
  {
    System.out.println("Connection Failed! Check output console");
    e.printStackTrace();
    return;
  }
  catch (Exception e) 
  {
    e.printStackTrace();
  }
}

Ответ 3

Вы следовали/читали этот урок:

Связь с MYSQL

У вас есть часть вашего исключения, которое может быть вам полезно.

Я приведу кое-что о вашем конкретном исключении, просто попробуйте следующее:

Если вы получаете сообщение SQLException: соединение отклонено или время ожидания подключения или связанная с MySQL связьException: связь неудача, то это означает, что БД недоступна. Это может имеют одну или несколько из следующих причин:

IP-адрес или имя хоста в URL-адрес JDBC неверны. Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером. Номер порта отсутствует или неверен в URL JDBC. Сервер БД отключен. Сервер БД не принимает TCP/IP соединения. У сервера БД закончились соединения. Что-то в между Java и DB блокирует соединения, например. брандмауэр или прокси.

Чтобы решить тот или иной, выполните следующие советы:

Проверьте и проверьте их с помощью ping. Обновить DNS или использовать IP-адрес в JDBC URL вместо этого. Проверьте его на основе my.cnf базы данных MySQL. Запустите БД. Убедитесь, что mysqld запущен без опции -skip-networking. Перезагрузите базу данных и исправьте свой код соответствующим образом, чтобы он закрывался наконец, соединения. Отключить брандмауэр и/или настроить брандмауэр/прокси, чтобы разрешить/переслать порт.