2012-03-13 42 views
10

He escrito un programa Java y el programa se conecta a una base de datos en mi servidor, para buscar registros, escribir registros, actualizar y eliminar. para algunos registros razón hallazgo funciona, pero la mayoría de las veces cuando trato de guardar o escribir un registro que da un mensaje de error que dice:No se puede leer la respuesta del servidor

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 

¿Puede alguien explicar por qué ocurre esto? Normalmente, esto me da el mensaje de error cuando intento agregar un registro, después de haber tenido el software en funcionamiento durante más de medio minuto. parece perder conexión o algo así. Cuando ejecuto el programa y rápidamente escribir un nuevo registro, funciona

+0

Muéstranos la parte significativa del código, que es la única manera en que podemos adivinar lo que está sucediendo. – pcalcao

+0

Debe administrar la conexión perdida cuidadosamente http://stackoverflow.com/a/8997413/90909 – qrtt1

+1

tenía el método con.close en mi clase de conector. ¿Es por eso por qué? – Pita

Respuesta

0

¿Ha seguido/leer este tutorial:

Connectivity with MYSQL

Usted tiene una parte para su excepción que puede ser útil para usted.

citaré algo acerca de su excepción específica, sólo tratar de que:

Si obtiene una excepción de SQL: Conexión rechazada o la conexión agotado o una CommunicationsException específica de MySQL: enlace de comunicaciones fracaso, entonces significa que el DB no es alcanzable en absoluto. Esto puede tener una o más de las siguientes causas:

La dirección IP o el nombre de host en JDBC URL es incorrecta. El nombre de host en JDBC URL es no reconocido por el servidor DNS local. El número de puerto falta o está incorrecto en URL de JDBC. El servidor de bases de datos no funciona. El servidor de base de datos no acepta las conexiones TCP/IP . El servidor de base de datos se ha quedado sin conexiones. Algo en entre Java y DB está bloqueando las conexiones, p. un firewall o proxy.

Para resolver el uno o el otro, siga los siguientes consejos:

las verificaciones y pruebas con ping. Actualice DNS o use la dirección IP en JDBC URL en su lugar. Verifíquelo basado en my.cnf de MySQL DB. Comienza la base de datos. Verificar si mysqld se inicia sin la opción --skip-networking. Reinicie la base de datos y corrija su código según corresponda para que finalice las conexiones . Deshabilite el cortafuegos y/o configure el cortafuegos/proxy para permitir/reenviar el puerto.

+0

lo seguí, pero hice todo bien según su url. Creo que es la sesión de tiempo de espera, lo que me impide hacer las cosas a mi DB. ¿Hay alguna forma de evitar la sesión de tiempo de espera? He leído algo sobre maxWait indefinido, pero no puedo encontrar ningún elemento específico sobre cómo declararlo, de modo que el sistema esperaría sin importar cuánto tiempo tome hasta que se reciba la respuesta. – Pita

1

A veces, este problema se debe al tamaño de la memoria RAM del sistema. Puede estar insertando los datos usando el búfer a través de la RAM. Para salir de este problema

  1. Establezca la desactivación de confirmación automática antes de insertar los datos.
  2. inserte una cierta cantidad de datos apropiados para su sistema RAM (no el entero).
  3. Confirme la consulta.
  4. Realice los pasos 2 y 3 nuevamente hasta que la inserción completa no se realice .

Puede comprender esto con el siguiente código.

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(); 
    } 
} 
4

Estaba teniendo el mismo tipo de problema. Remití muchas publicaciones y comentarios, pero lo que funcionó fue cambiar algunos parámetros del archivo my.cnf. Espero que le ayudará también ....

Set siguientes parámetros en my.cnf [mysqld] sección

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" 
+1

valor de 'skip-name-resolve'? Gracias –

Cuestiones relacionadas