Conectar a aplicação Java ao MySQL Remoto

Boa tarde, pessoal

Estou tendo o seguinte problema, preciso conectar a aplicação Java em um banco de dados MySQL que está hospedado na Hostgator. Na Hostgator já configurei o MySQL remoto e consigo acessá-lo através do MySQL Workbench e abri a porta 3306 no meu roteador.

Na aplicação Java inclui o driver MySQL e crie a classe de conexão, passando o endereço IP do servidor, nome do banco de dados, usuário e senha. Consigo gerar a conexão e ao realizar a consulta no banco sempre é retornado null.
Testei o mesmo código através do XAMPP e funcionou perfeitamente.

Olhei alguns post aqui no fórum referente a este tema, mas até o momento não consegui resolver o problema.

Esta usando Jdbc ?

primeira coisa, veja se no painel da sua hospedagem, nao precisa liberar o IP que vai acessar o banco, caso precise, tem que liberar.

segunda coisa, geralmente o usuario da hospedagem nao acessa direto o banco, voce precisa criar um usuario so para essa base de dados.

terceiro, confirme a versao do banco de dados da hospedagem, se for a versao 8 tem uma diferenca na url do driver.

eu tenho um banco na integrator, que é acessado sem problema pelo heroku e outra base de dados que eu acesso da minha maquina para testes, e funciona numa boa. Uso spring-boot e nodejs

*O IP já está liberado no painel da hospedagem. Consigo acessar o banco do meu PC pelo MySQL Workbench.
*O usuário somente para acessar o banco de dados já foi criado é com este usuário que estou tentando acessar através do Java.
*A versão do MySQL no servidor da hospedagem é o 5.7.31. Estou utilizando a seguinte URL na classe de conexão: jdbc:mysql://ip-do-servidor:porta/banco-de-dados.
*No projeto inclui a biblioteca do driver JDBC do MySQL.

Estou exatamente com o mesmo problema, meu site e base de dados estão hospedados no Alphaservers.

Como vc conseguiu acessar pelo Workbanch? eu tentei e não consegui.

voce esta referenciando o driver da classe como?

Não entendi.

Estou utilizando essa classe para fazer a conexão com o banco de dados:

public class ConnectionManagerMySQLWebinar {

    public static String status = "Não conectou...";

    public ConnectionManagerMySQLWebinar(String servidor) {

    }

//Método de Conexão//
    public static java.sql.Connection getConexaoMySQL() throws SQLException {
        Connection connection = null;          
        try {
            // Carregando o JDBC Driver padrão
            String driverName = "com.mysql.jdbc.Driver";
            Class.forName(driverName);
            
            String serverName = "192.168.254.197:3306";                          
            String mydatabase = "nome_banco";                         
            String url = "jdbc:mysql://" + serverName + "/" + mydatabase;
            String username = "usuario_banco";                               
            String password = "senha_banco";                               
            connection = DriverManager.getConnection(url, username, password);

            return connection;

        } catch (ClassNotFoundException e) {  
            System.out.println("O driver expecificado nao foi encontrado.");
            return null;

        } catch (SQLException e) {
            System.out.println("Nao foi possivel conectar ao Banco de Dados.");
            return null;
        }
    }

    
    public static String statusConection() {
        return status;
    }

    
    public static boolean FecharConexao() {
        try {
            ConnectionManagerMySQLWebinar.getConexaoMySQL().close();
            return true;

        } catch (Exception e) {
            return false;
        }
    }

    
    public static java.sql.Connection ReiniciarConexao() throws Exception {
        FecharConexao();
        return ConnectionManagerMySQLWebinar.getConexaoMySQL();
    }
}

E no service crio a conexão da seguinte forma:
Connection conn = ConnectionManagerMySQLWebinar.getConexaoMySQL();

Essa conexão passo como parâmetro para o DAO ao realizar a consulta. Coloquei apenas alguns trechos do método aqui.

String sql = "consulta";
Statement ps = conn.createStatement();
ResultSet rs = ps.executeQuery(sql);

while(rs.next()){
     //Pega os resultados retornados.
}

rs.close();
rs.close();

Se pelo Workbench esta tudo certo e sempre esta retornando null pelo Jdbc, supoe que esta parando no caminho.
Mas pode sim ser problema de versao do Jdbc.
Qual a versao do Java ?
Qual a versao do driver Jdbc ?

Estou utilizando o Java 1.8.0_261 e o driver JDBC está na versão 5.1.23.

versao

Pode ser a versão mesmo.

já consegui estabelecer a conexão com o banco e o Workbanch, mas ainda não consegui pelo app também.

vamos la, primeiro atualize esse driver do mysql
mysql driver

ultima versao para conectar com mysql 8.0

faça esse ajuste na url de conexao

jdbc:mysql://ip-do-servidor:porta/banco-de-dados?useSSL=false
veja se apenas assim funciona.

cola tambem o erro do console que esta dando quando voce tenta a conexao.

1 curtida

Deu certo, era problema com a versão do driver. Atualizei o consegui acessar os dados.

Atualizei, mas agora apareceu outro erro.

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mmempresa, PID: 10917
java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of ‘java.lang.invoke.LambdaMetafactory’ appears in /apex/com.android.runtime/javalib/core-oj.jar)

Estou usando o seguinte código:

    public class dbMySQL extends Activity{

   private Connection conn = null;
   private Statement st;
   private String sql;
   private ResultSet rs;

public void conectarMySQL(String host, String porta, String banco, String usuario, String senha){
    try{
        Class.forName("com.mysql.jdbc.Driver").newInstance();
    }catch(Exception erro){
        Log.e("MYSQL","Erro: "+erro);
    }

    try{
        conn=DriverManager.getConnection("jdbc:mysql://"+host+":"+porta+"/"+banco+"?useSSL=false",usuario,senha);

        Log.i("MYSQL","Conectado.");
    }catch(Exception erro){
        Log.e("MYSQL","Erro: "+erro);
    }
}

public void desconectarMySQL(){
    try {
        conn.close();
        Log.i("MYSQL","Desconectado.");
    } catch (Exception erro) {
        Log.e("MYSQL","Erro: "+erro);
    }
}

public void queryMySQL(){
    try{
        st=conn.createStatement();
        sql="SELECT * FROM usuario";
        rs=st.executeQuery(sql);
        rs.first();
        Log.i("MYSQL","Resultado: "+rs.getString("cpf"));
    } catch (Exception erro){
        Log.e("MYSQL","Erro: "+erro);
    }
}}

Adenilson, me mostra como tá seu código, por gentileza.

voce esta usando esse driver do mysql numa aplicacao android?
ou entao a versao que voce esta usando do java pode ser mais antiga.

Isso.
mas eu já testei com 2 versões do mysql:
mysql-connector-java-5.1.15
mysql-connector-java-8.0.21 (mais atual)

todas as duas deram erro!

acredito que esse driver para android nao funcione.