Sv Community El Salvador

Soporte y Tecnología => Programación => Java => Mensaje iniciado por: gilanrodas en julio 31, 2011, 10:29:09 am

Título: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: gilanrodas en julio 31, 2011, 10:29:09 am
Me surgió un nuevo error al probar mi aplicación de forma local, aunque conectándome de forma remota a mi base de datos, así que creé un formulario más pequeño y sencillo sólo para probar, y en ese formulario más sencillo no me da ese problema. La excepción es la siguiente:

Código: [Seleccionar]
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 31 ms ago.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564)
        at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485)
        at Classes.Conexion.ejecutarSQL(Conexion.java:66)
        at osceswebapp.FormNuevo.guardarDatos(FormNuevo.java:1752)
        at osceswebapp.FormNuevo.btnNuevoActionPerformed(FormNuevo.java:1320)
        at osceswebapp.FormNuevo.access$4100(FormNuevo.java:38)
        at osceswebapp.FormNuevo$39.actionPerformed(FormNuevo.java:974)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
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:2431)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882)
        ... 36 more

Leí por ahí que quizá sea cuestión de cambiar la configuración en algún archivo de configuración, y que es uno de los errores que más dolor de cabeza dan porque cuesta saber a qué se deben. Además, cabe mencionar que en dos ocasiones no me ha dado el problema y el insert se ejecuta perfectamente, pero de ahí siempre me muestra la excepción y no se guardan los datos. No entiendo por qué dice que se pierde la conexión  :sorry:
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: ken2 en julio 31, 2011, 10:33:27 am
Pasa el codigo que tira exception y donde configuras la conexión  :drinks:
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: gilanrodas en julio 31, 2011, 11:24:18 am
Pasa el codigo que tira exception y donde configuras la conexión  :drinks:

Esta es mi clase Conexion:
Código: [Seleccionar]
package Classes;



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author monillo007

 */

public class Conexion {
    private Connection conexion;
   
    /** Creates a new instance of Conexion */
    public Conexion() {
    }
   
    /**
     * M�todo utilizado para recuperar el valor del atributo conexion
     *@return conexion contiene el estado de la conexi�n
     *
     */
    public Connection getConexion()
    {
        return conexion;
    }
   
    /**
     * M�todo utilizado para establecer la conexi�n con la base de datos
     *@return estado regresa el estado de la conexi�n, true si se estableci� la conexi�n,
     *                          falso en caso contrario
     */
    public boolean crearConexion(String db, String user, String pass)
    {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection(db,user,pass);
        } catch (SQLException ex) {
            ex.printStackTrace();
            return false;
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
            return false;
        }
       
        return true;
    }
   
    /**
     *
     *M�todo utilizado para realizar las instrucciones: INSERT, DELETE y UPDATE
     *@param sql Cadena que contiene la instrucci�n SQL a ejecutar
     *@return estado regresa el estado de la ejecuci�n, true(�xito) o false(error)
     *
     */
    public boolean ejecutarSQL(String sql)
    {
        try {
            Statement sentencia = conexion.createStatement();
            sentencia.executeUpdate(sql);
        } catch (SQLException ex) {
            ex.printStackTrace();
            return false;
        }
       
        return true;
    }
   
   /**
     *
     *M�todo utilizado para realizar la instrucci�n SELECT
     *@param sql Cadena que contiene la instrucci�n SQL a ejecutar
     *@return resultado regresa los registros generados por la consulta
     *
     */
    public ResultSet ejecutarSQLSelect(String sql)
    {
        ResultSet resultado;
        try {
            Statement sentencia = conexion.createStatement();
            resultado = sentencia.executeQuery(sql);
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
       
        return resultado;
    }   
   
   
   
   
}

Aquí creo la conexión:
Código: [Seleccionar]
public class FormNuevo extends javax.swing.JApplet {

    Conexion conexion;
    String db = "jdbc:mysql://profcomp.com:3306/profcomp_osces";
    String user = "user";
    String pass = "pass";
    String operacionRealizar; //Indicará el tipo de operación que se realizará
                              //al guardar datos: Insert, Update, Cancelar, etc.
                              //Dicho string se asignará al momento de presionar
                              //algún botón.

    public FormNuevo (){
        //this.setExtendedState(this.MAXIMIZED_BOTH);
        conexion = new Conexion();
        conexion.crearConexion(db,user,pass);
        try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {
e.printStackTrace();
}
    }
}

A este procedimiento lo llamo desde un botón "Guardar", y previo a esto sólo hago la cadena insert para la variable "sql":
Código: [Seleccionar]
private void guardarDatos(){
      conexion.ejecutarSQL(sql);
}

Ahora, me parece extraño que en dos ocasiones me ha funcionado y después no, sin haber hecho cambio en el proyecto, y que además con otro formulario no me de error cuando utilizo la misma clase Conexion y los mismos parámetros de conexión.
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: ken2 en julio 31, 2011, 11:27:36 am
Hace un ping al server haber sino tenes packet loss.  :drinks:
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: gilanrodas en julio 31, 2011, 11:32:21 am
Hace un ping al server haber sino tenes packet loss.  :drinks:

Todo bien.
Código: [Seleccionar]
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

I:\Documents and Settings\Gilberto Rodas (Jr.)>ping profcomp.com

Haciendo ping a profcomp.com [74.54.176.162] con 32 bytes de datos:

Respuesta desde 74.54.176.162: bytes=32 tiempo=177ms TTL=47
Respuesta desde 74.54.176.162: bytes=32 tiempo=155ms TTL=47
Respuesta desde 74.54.176.162: bytes=32 tiempo=154ms TTL=47
Respuesta desde 74.54.176.162: bytes=32 tiempo=143ms TTL=47

Estadísticas de ping para 74.54.176.162:
    Paquetes: enviados = 4, recibidos = 4, perdidos = 0
    (0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
    Mínimo = 143ms, Máximo = 177ms, Media = 157ms

I:\Documents and Settings\Gilberto Rodas (Jr.)>
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: ken2 en julio 31, 2011, 11:38:47 am
Ejecuta otra consulta que tengas pero con el mismo formulario.  :drinks:
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: gilanrodas en julio 31, 2011, 11:44:43 am
Ejecuta otra consulta que tengas pero con el mismo formulario.  :drinks:
Ok! Ahorita voy a probar cambiar la instrucción.

Por cierto, fijate que encontré por ahí que puede ser problema de red pero sigo sin entender por qué con otro formulario no me da problema:
http://ricardoramirez00.wordpress.com/2010/12/05/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-failure/ (http://ricardoramirez00.wordpress.com/2010/12/05/com-mysql-jdbc-exceptions-jdbc4-communicationsexception-communications-link-failure/)
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: ken2 en julio 31, 2011, 11:52:19 am
El problema que tienes es porque ese servidor a veces no deja pasar las autenticaciones a otros servidores de mysql

proba con localhost, subi tú archivo al host y desde el host proba, pero no pongas la url de mysql, pone localhost.

String db = "jdbc:mysql://localhost:3306/profcomp_osces";
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: gilanrodas en julio 31, 2011, 12:15:25 pm
El problema que tienes es porque ese servidor a veces no deja pasar las autenticaciones a otros servidores de mysql

proba con localhost, subi tú archivo al host y desde el host proba, pero no pongas la url de mysql, pone localhost.

String db = "jdbc:mysql://localhost:3306/profcomp_osces";

Buen punto. Lo voy a probar ahorita. ¡Gracias! Sólo me queda otra duda ahí: ¿Tengo que subir todo el proyecto o sólo el jar o qué ondas? Lo que estoy haciendo es nada más una página sencilla en html y agrego solamente el formulario que quiero que aparezca con el código:
Código: [Seleccionar]
<applet code="osceswebapp.FormNuevo" archive="OscesWebapp.jar" width="850" height="700"></applet>
Título: Re: Ayuda: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
Publicado por: ken2 en julio 31, 2011, 01:37:04 pm
subilo todo a otra carpeta aparte, nos contas que paso.  :drinks:
Título: Re: Ayuda: Me crea el objeto Conexion pero no conecta
Publicado por: gilanrodas en agosto 02, 2011, 10:29:10 am
subilo todo a otra carpeta aparte, nos contas que paso.  :drinks:

Fijate que ya no me da error, ahora el único problema que tengo es nada más que no me ejecuta el procedimiento crearConexion  :shock: aunque sí me crea el objeto Conexion. ¿Será que hay algún problema con el driver o en la línea:
Código: [Seleccionar]
Class.forName("com.mysql.jdbc.Driver"); ?

Cabe mencionar que la base de datos la estoy trabajando en phpmyadmin y que además si corro el programa en mi computadora, por conexión remota, me funciona bien, pero cuando subo el proyecto es que no me está funcionando, usando localhost:3306 o profcomp.com:3306
Título: Re: Ayuda: Aplicación no me corre en el navegador
Publicado por: gilanrodas en agosto 02, 2011, 11:10:06 am
Acabo de notar que aunque ejecute mi programa de forma local pero en el navegador, no me crea la conexión. Si desde Netbeans lo ejecuto, me funciona normal, pero al ejecutarlo desde IE o Mozilla no me crea la conexión, solo el objeto.