Erro de conexão com banco de dados MySQL (em Rede)

Caros,
o código abaixo é de uma pequena aplicação java desktop, que tem por base fazer a conexão com um banco de dados mysql e inserir os dados que estão do jTextField 1 e 2 na tabela chamada usuario dentro do db oi.

Connection con = null;
	     try
	     {
	         Class.forName("com.mysql.jdbc.Driver");
	         con = DriverManager.getConnection("jdbc:mysql://10.20.194.170:3306/oi","usuario1","");
	         Statement stm = con.createStatement();
	         stm.executeUpdate("insert into usuario values('"+jTextField1.getText()+"','"+jTextField2.getText()+"');");
             JOptionPane.showMessageDialog(null,"Dados Cadastrados com sucesso.","Oi. Simples assim!",JOptionPane.INFORMATION_MESSAGE);
             jLabel1.setText(jTextField1.getText());
             jLabel2.setText(jTextField2.getText());
             jTextField1.setText("");
             jTextField2.setText("");            
         }catch(SQLException e){
	         e.printStackTrace(); //vejamos que erro foi gerado e quem o gerou
             JOptionPane.showMessageDialog(null,"Erro na conexão, com o banco de dados 1! \n" + e.getMessage()+"\n"+e.getCause()+"\n" + e.getSQLState() + "\n" +e.getErrorCode(),"Oi. Simples assim!",JOptionPane.WARNING_MESSAGE);
	     }catch (ClassNotFoundException e) {
		e.printStackTrace();
        JOptionPane.showMessageDialog(null,"Erro na conexão, com o banco de dados 2! \n"+e.getMessage() +"\n"+ e.getCause()+"\n"+e.getException(),"Oi. Simples assim!",JOptionPane.WARNING_MESSAGE);
		}finally {
	        try{
	           con.close();
	        }catch(SQLException onConClose){
                JOptionPane.showMessageDialog(null,"Erro na conexão, com o banco de dados 3!","Oi. Simples assim!",JOptionPane.WARNING_MESSAGE);
	            //System.out.println("Houve erro no fechamento da conexão");
	            onConClose.printStackTrace();
	        }
        }

o erro que retorna é o seguinte:

“Erro na conexão, com o banco de dados 2!” (a mensagem que eu escrevi, caso ocorresse algum erro)
com.mysql.jdbc.Driver
null
null

Coloca a saída do e.printStackTrace(); q fica mais fácil de ajudar…

todo o código de erro gerado após a tentativa da conexão com banco de dados mysql é o seguinte abaixo:

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

Last packet sent to the server was 0 ms ago.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:539)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
        at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
        at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:539)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
        at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
        at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
        at java.sql.DriverManager.getConnection(DriverManager.java:620)
        at java.sql.DriverManager.getConnection(DriverManager.java:200)
        at rafael.rafael2.jButton1MouseClicked(rafael2.java:82)
        at rafael.rafael2.access$000(rafael2.java:6)
        at rafael.rafael2$1.mouseClicked(rafael2.java:33)
        at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
        at java.awt.Component.processMouseEvent(Component.java:6120)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3293)
        at java.awt.Component.processEvent(Component.java:5882)
        at java.awt.Container.processEvent(Container.java:2101)
        at java.awt.Component.dispatchEventImpl(Component.java:4477)
        at java.awt.Container.dispatchEventImpl(Container.java:2159)
        at java.awt.Component.dispatchEvent(Component.java:4303)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4595)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4267)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4188)
        at java.awt.Container.dispatchEventImpl(Container.java:2145)
        at java.awt.Window.dispatchEventImpl(Window.java:2559)
        at java.awt.Component.dispatchEvent(Component.java:4303)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
Caused by: java.net.ConnectException: Connection timed out: connect
        at java.net.TwoStacksPlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:310)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:176)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:163)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:154)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:380)
        at java.net.Socket.connect(Socket.java:569)
        at java.net.Socket.connect(Socket.java:519)
        at java.net.Socket.<init>(Socket.java:416)
        at java.net.Socket.<init>(Socket.java:232)
        at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:253)
        at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:280)
        at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2026)
        ... 35 more
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at rafael.rafael2.jButton1MouseClicked(rafael2.java:100)
        at rafael.rafael2.access$000(rafael2.java:6)
        at rafael.rafael2$1.mouseClicked(rafael2.java:33)
        at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270)
        at java.awt.Component.processMouseEvent(Component.java:6120)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3293)
        at java.awt.Component.processEvent(Component.java:5882)
        at java.awt.Container.processEvent(Container.java:2101)
        at java.awt.Component.dispatchEventImpl(Component.java:4477)
        at java.awt.Container.dispatchEventImpl(Container.java:2159)
        at java.awt.Component.dispatchEvent(Component.java:4303)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4595)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4267)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4188)
        at java.awt.Container.dispatchEventImpl(Container.java:2145)
        at java.awt.Window.dispatchEventImpl(Window.java:2559)
        at java.awt.Component.dispatchEvent(Component.java:4303)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

se precisar de mais informações eu tentarei buscá-las…
desde já obrigado pela atenção!

Você adicionou o conector do mysql às bibliotecas de execução???

Coloquei dentro da biblioteca sim…

Você colocou dentro dos dois ClassPath’s o de compilação e o de Execução!!!

Pq o que se código tá lançando é uma exceção na hora de achar a classe do conector…

Eu sugiro você otimizar um pouco o código e dividir as funções e verifique se realmente as bibliotecas estão todas ok!!!

[code]package camadaBancoDados;

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

public class JDBC {

private String usuario="<usuario>";
private String senha="<senha>";
private String url = "jdbc:mysql://<Banco>:3306/";
private Connection con;

/** Creates a new instance of Banco */
public JDBC() {
}

public Connection conexao() throws ClassNotFoundException, SQLException, Exception{
    try{
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(url, usuario, senha);
        return con;
    }catch(ClassNotFoundException classE){
        throw classE;
    }catch(SQLException sqlE){
        throw sqlE;
    }catch(Exception e){
        throw e;
    }
}

}[/code]

[code]package camadaDAO;

import camadaBancoDados.JDBC;
import java.lang.Exception;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class PersistJDBC {

public String sqlReturn(String query) throws Exception{
    ResultSet rs = null;
    String retorno = "";
    try{
        Statement st = new JDBC().conexao().createStatement();
        rs = st.executeQuery(query);
        if(rs.next()){
            retorno = rs.getString(1);
        }
        return retorno;
    }catch(Exception e){
        throw e;
    }
}

public void executeCommand(String query) throws Exception{
    try{
        Statement st = new JDBC().conexao().createStatement();
        st.executeUpdate(query);
    }catch(Exception e){
        throw e;
    }
    
}

}[/code]

Dá uma olhada nesse tópico: http://www.guj.com.br/posts/list/50610.java

A galera tá discutindo sobre acoplamento em JAVA.

Quando eu coloco programa.jar na máquina local, cujo o IP é 10.20.194.170 o programa roda numa boa e insere a informação no MySQL. Tudo muda quano eu jogo o mesmo programa.jar para a rede e tento utilizá-lo pela mesma máquina (IP: 10.20.194.170) e retornar o erro mencionado acima!

Duas coisas resolvem seu problema.

Verifique na conexão se os argumentos da localização do Banco estão OK.

/**Aonde <Servidor é o número do IP do computador aonde está o banco> E <Banco é o nome do seu banco>*/ String url = "jdbc:mysql://<Servidor>:3306/<Banco>"

E uma última coisa.

Você precisa reconfigurar seu MySql para que ele se comporte como servidor e aceite conexões externas ao localhost.

[quote=jj_df]Duas coisas resolvem seu problema.

Verifique na conexão se os argumentos da localização do Banco estão OK.

/**Aonde <Servidor é o número do IP do computador aonde está o banco> E <Banco é o nome do seu banco>*/ String url = "jdbc:mysql://<Servidor>:3306/<Banco>"

E uma última coisa.

Você precisa reconfigurar seu MySql para que ele se comporte como servidor e aceite conexões externas ao localhost.[/quote]

A localização do banco está ok.
Está assim:

con = DriverManager.getConnection("jdbc:mysql://10.20.194.170:3306/oi","usuario1","");

agora que você tocou no assunto da configuração do MySQL fiquei desconfiado que seja este o problema!

segue a minha configuração de MySql:

  • Dedicated MySQL Server Machine

  • Non-Transactional Database Only

  • Online Transaction Processing (OLTP)

  • Enable TPC/IP Networking

  • Enable Strict Mode

  • Standard Character Set

  • Install As Windows options

  • Include Bin Directory in windows Path

  • senha do root

  • Enable root access from remote machines

vlw mesmo, vou até pesquisar um pouco mais sobre essa configuração do mysql se comportar como servidor, se você puder continuar ajudando vai ser adiantar bastante a minha vida!

jj_df,
acredito que a solução possa estar na correção dos driver’s nas duas Classpath’s o de execução e o de compilação. Para onde minha variável de ambiente Classpath está apontando, foi onde eu coloquei o driver .jar do mysqlconnector, dentro do projeto eu criei um pacote (package) com nome de br.com.lib e dentro está o mesmo driver, além de adicioná-lo na biblioteca também. A minha dúvida é saber a diferença entre Classpath de Compilação e de Execução. Pode me ajudar?

Caros,
já pesquisei em diversos sites/foruns da internet e a configuração do mysql para funcionar como servidor e aceitar conexões TCP/IP é a mesma postada acima.

Classpath: C:\Arquivos de programas\Java\jdk1.6.0_11\jre\lib\ext
>> dentro tem o arquivo: mysql-connector-java-5.1.6-bin.jar

Diretório do Programa: C:\Documents and Settings\U97289\Meus documentos\NetBeansProjects\rafael\dist
>> quando é gerado o arquivo .jar do programa, este é ocaminho, dentro da pasta “dist” existe uma pasta "lib"
que contém também o arquivo mysql-connector-java-5.1.6-bin.jar (criado automaticamente quando gera o programa.jar)

Por que o código funciona com:

e não funciona com:

se localhost e 10.20.194.170 é a mesma máquina?

obs.: quando coloco o IP no lugar do localhost, tento executar da rede e me retornar o erro:

catch (ClassNotFoundException e) {
		e.printStackTrace();
        JOptionPane.showMessageDialog(null,"Erro na conexão, com o banco de dados 2! \n" +e.getMessage() +"\n"+ e.getCause()+"\n"+e.getException(),"Oi. Simples assim!",JOptionPane.WARNING_MESSAGE);


erros retornados:
>> e.getMessage() = com.mysql.jdb.Driver
>> e.getCause() = null
>> e.getException() = null

obrigado a atenção de todos e continuo tentando, mas preciso de muita ajuda ainda…

[quote=jj_df]Você colocou dentro dos dois ClassPath’s o de compilação e o de Execução!!!

Pq o que se código tá lançando é uma exceção na hora de achar a classe do conector…

Eu sugiro você otimizar um pouco o código e dividir as funções e verifique se realmente as bibliotecas estão todas ok!!!

[code]package camadaBancoDados;

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

public class JDBC {

private String usuario="<usuario>";
private String senha="<senha>";
private String url = "jdbc:mysql://<Banco>:3306/";
private Connection con;

/** Creates a new instance of Banco */
public JDBC() {
}

public Connection conexao() throws ClassNotFoundException, SQLException, Exception{
    try{
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(url, usuario, senha);
        return con;
    }catch(ClassNotFoundException classE){
        throw classE;
    }catch(SQLException sqlE){
        throw sqlE;
    }catch(Exception e){
        throw e;
    }
}

}[/code]

[code]package camadaDAO;

import camadaBancoDados.JDBC;
import java.lang.Exception;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class PersistJDBC {

public String sqlReturn(String query) throws Exception{
    ResultSet rs = null;
    String retorno = "";
    try{
        Statement st = new JDBC().conexao().createStatement();
        rs = st.executeQuery(query);
        if(rs.next()){
            retorno = rs.getString(1);
        }
        return retorno;
    }catch(Exception e){
        throw e;
    }
}

public void executeCommand(String query) throws Exception{
    try{
        Statement st = new JDBC().conexao().createStatement();
        st.executeUpdate(query);
    }catch(Exception e){
        throw e;
    }
    
}

}[/code]

Dá uma olhada nesse tópico: http://www.guj.com.br/posts/list/50610.java

A galera tá discutindo sobre acoplamento em JAVA.
[/quote]

pode, por favor, me explicar melhor o que é classpath de complicação e de execução?
não consegui identificar a diferença!
desculpe, pois não conheço!

Caros,
muito obrigado por toda a ajuda!
após ler muito sobre minhas dúvidas, lógico que “o caminho das pedras” foi dado pelo forum, encontrei a solução do problema.

Solução:
Adicionar o mysqlconnector nas duas bibliotecas (execução e teste), gerar o .jar e levar pra rede e ser feliz!!!

mais uma vez, muito obrigado a todos…
e valeu pela atenção jj_df