Java + PHP

Olá pessoal.
Bom, tenho uma aplicação desenvolvida em Java que faz acesso a uma base MySQL remotamente através do driver jdbc do mysql (mysql-connector-j.jar), porém estou tendo alguns problemas por parte do servidor, que vira e meche para de aceitar conexões remotas.

Gostaria de reescrever a aplicação de forma a fazer as chamadas ao mysql através de funções em php (O servidor somente suporta php, se suportasse java servlets pra mim seria uma maravilha) e receber os retornos pela aplicação java.

Resumindo, quero integrar Java Desktop com PHP.
Isso seria possível?

Eu já vi alguns exemplos em posts deste forum e no mestre google… porém encontrei somente integração PHP - Java (Chamar funções java a partir do php) e não o contrário.

Estou meio desesperado… se alguém puder me ajudar.

Abraço

Seria mais facil ajustar as conexões já existentes, se tudo estiver configurado e desenvolvido de forma correta não era para existir problemas algum com a conexão com o mysql.

O que vc usa nessa conexao Java JDBC, Hibernate ?

Bom sim.

Desculpe mas, eu acredito que não expressei bem o problema.
Este servidor é um servidor de páginas contratado pelo cliente.

Por algum motivo ele pára de aceitar conexões remotas as vezes, e quando isso ocorre, a aplicação do cliente não funciona.

Porém, nas páginas em php do servidor que fazem acesso local ao mysql, não acontece nada…

O que eu queria era evitar esse tipo de problema de perda de conexão realizando as operações dml a partir de uma página php.

Sei sim que era para funcionar perfeitamente se tudo estivesse configurado da maneira correta, acontece que essa configuração não depende de mim, e sim do servidor contratado, entende?

Alguém poderia me ajudar?

A propósito.

Não utilizo Hibernate ou qualquer outra JPA existente.

Faço conexões diretas a partir de java.sql.DriverManager…
a propósito. sei que este método é obsoleto para conexões com o banco e que utilizando DataSource seria o método ideal para conexão direta com jdbc, porém, esta foi uma das primeiras aplicações que desenvolvi.

ehimura, bom dia

Num primeiro momento, acho estranho o que você pretende fazer, mas compreendo que o problema existe e exige uma solução.

Se o problema é o servidor que para de aceitar conexões remotas acho que você deve se concentrar nele (problema), como o Pedrosa mencionou.

Já tivemos uma situação que precisavamos usar uma aplicação com conexão remota (o servidor estava bem distante fisicamente dos clientes), e tínhamos problema de perda da conexão.
Após um tempo de inatividade no cliente-desktop, o banco de dados retornava lost connection.
Resolvemos isso com uma bela POG, tipo:

if (conectar == true){ //ok } else { //tente conectar de novo }

O problema estava com algumas variáveis de timeout do banco de dados (era MySQL). Alteramos os valores padrões e o sistema ficou melhor.

Mas parece que o seu problema é outro, essa é somente uma experiência que estou compartilhando contigo.

Tem que considerar que o PHP está num servidor WEB e você terá que passar por ele antes de chegar no servidor de banco de dados (pode estar na mesma máquina, mas mesmo assim você terá que passar por aquele).

O PHP processa as solicitações no servidor, geralmente seu resultado é uma página HTML, acessada pelo browser.

Talvez alguma espécie de webservice (posso estar falando besteira), usando o PHP e XML (e trabalhando esse XML pelo JAVA).
Vejo muito trabalho nesse sentido, acho que deve verificar se vale a pena.

Cara é bem simples ajustar sua aplicação para usar um Poll de conexão, a idéia do joellazzari de usar web service é interessante, mais terá que ser desenvolvida, coloque como esta sua conexão aqui para que possamos ajuda-lo e como e vc usa na sua aplicação.

Olá Joellazzari

Certo, eu entendi o que quis dizer e estava pensando em algo deste tipo mesmo.
A dúvida está em:
Existe uma forma de fazer isso utilizando php?
Se sim, como eu faço para acessar os métodos POST do php a partir da aplicação java e receber o resultado que seria o XML?

Isso seria muito fácil se o servidor tivesse suporte ao tomcat juntamente com o apache axis… o problema é que não tem e eu não tenho a mínima idéia de como recuperar os resultados de uma página php.

Segue o método de conexão com o banco MySQL:

[code]//conecta ao banco de dados
public void conecta() {

    try{
        
        Class.forName(driver);
        con = DriverManager.getConnection(url, usuario, senha);
        
        stmt = con.createStatement();
        
    }catch (Exception e) {
        System.err.println(e);
        e.printStackTrace();
        javax.swing.JOptionPane.showMessageDialog(chamador, "Erro ao conectar-se com o banco de dados.\nVerifique a disponibilidade da conexão e tente novamente ou contate o administrador da rede.\n" + e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
    }        
    
}[/code]

O Método de consulta é o seguinte:

[code]public ResultSet query(String query) {

    try {
        
        conecta();
        rs = stmt.executeQuery(query);
        //desconecta();
        
        return rs;

        
    } catch (SQLException ex) {
        Logger.getLogger(Banco.class.getName()).log(Level.SEVERE, null, ex);
        JOptionPane.showMessageDialog(chamador, "Erro ao consultar Banco de Dados\nVerifique a validade dos dados.\n" + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
    }
    
    return null;
}[/code]

O método de atualização é o seguinte:

[code]public boolean update(String query, boolean mensagem)
{
int resultado;
try {

        System.out.println(query);
        
        conecta();
        
        resultado = stmt.executeUpdate(query);
        
        desconecta();
        
        if (mensagem)
            JOptionPane.showMessageDialog(chamador, "Dados cadastrados/alterados com sucesso", "Sucesso", JOptionPane.INFORMATION_MESSAGE);
        
        return true;
        
     } catch (SQLException ex) {
        Logger.getLogger(Banco.class.getName()).log(Level.SEVERE, null, ex);
        JOptionPane.showMessageDialog(chamador, "Erro ao atualizar Banco de Dados\nVerifique a validade dos dados ou a disponibilidade do banco de dados.\n" + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        return false;
    } 
    
}[/code]

e por fim, o método de desconexão é o seguinte:

public void desconecta() { try { con.close(); } catch (SQLException ex) { Logger.getLogger(Banco.class.getName()).log(Level.SEVERE, null, ex); } }

Bom, também tem um pequeno problema.

Quando eu tento conectar no servidor de banco de dados, ele retorna o seguinte erro:

Impossível conectar. Não é possível estabelecer uma conexão para jdbc:mysql://<nome_do_host>:3306/<nome_do_banco> utilizando com.mysql.jdbc.Driver (Communications link failure Last packet sent to the server was 0 ms ago.).

Este erro só ocorre quando tento uma conexão remota.

Também tentei acessar a porta do MySQL vai telnet:

telnet <nome_do_host> 3306

e recebo a resposta:

Não foi possível abrir conexão com host, na porta 3306: conexão falhou.

O nome do host e porta estão corretos, isso tenho certeza.

O banco também está on pois o site do cliente está funcionando normalmente (mesmo depois de limpar o cache do meu navegador).

Não sei mesmo o que fazer…

Espero que me ajudem

ehimura, respondendo somente a essa última msg do post

Você verificou se o MySQL em questão aceita conexões remotas?
Por padrão (e por uma questão de segurança também) ele não aceita conexões de outras máquinas (somente localhost).

Tinha entendido inicialmente que as vezes você conseguia conexão, outras não.

Sim sim, está aceitando conexões remotas de qualquer ip.

Wildcat %.%.%.%

Complementando, jellazzari.

Até sexta-feira o servidor estava normal.
No sábado de manhã ele já não estava aceitando conexões remotas, somente local.

Tentei remover a propriedade de conexão remota e adicioná-la novamente, porém não adiantou nada.

Uma vez, esse problema já havia ocorrido, mas não demorou nem 10 minutos e o servidor estava no ar novamente.
Agora está desde sexta-feira.

Queria fazer a comunicação com o banco através de funções php para evitar esse tipo de problema novamente.

Encontrei um artigo que deve me ajudar, segue para quem quiser ter conhecimento.
http://imasters.uol.com.br/artigo/4535/php/construindo_web_services_em_php/

Abraço a todos.
Vou testar esse método e posto o resultado aqui.

Bom.

Consegui resolver o problema.
Para aqueles que acompanhavam…
Na verdade era um problema no Firewall do servidor que não estava aceitando conexões remotas.

Brigadão pro pessoal que deu uma força ae…

Abraço