Como melhorar desempenho conexao remota

11 respostas
N

boa tarde galera

tenho um sistema em que roda na rede e na net... porém, o desempenho via net está baixo.
meu sistema foi desenvolvido com java + mysql obs.: desktop

minha conexão:

package padrao;
import java.sql.*;
import javax.swing.JOptionPane;
 
public class conecta {

public conecta() {}
       Connection conn = null;
public Connection conecta(){
        Conecta_ACCESS conexao = new Conecta_ACCESS();
        try{
        Connection  con = conexao.conect();   
        Statement stmt = con.createStatement();
        String procura = "select * from tbl_caminho where CODIGO="+ 1;
        ResultSet rs = stmt.executeQuery(procura);           
       while(rs.next()){        
        String ip = rs.getString("ENDERECO");//busca endereço(ip) no bd acess
        //String driver = "org.gjt.mm.mysql.Driver"; 
        String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC
        String banco = "bdrn"; //Nome do Banco criado
        String host = ip; //Maquina onde está o banco
        String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão
        String usuario = "root"; //Usuário do banco
        String senha = "nalldo36"; //Senha de conexão
        try {
           Class.forName(driver); //Carrega o driver 
           conn = DriverManager.getConnection(str_conn, usuario, senha);
        }catch(ClassNotFoundException e){
           JOptionPane.showMessageDialog(null,"n Driver não encontrado!\n"+ e,"ATENÇÃO",JOptionPane.WARNING_MESSAGE);
           return null;
        }catch(SQLException e){
           JOptionPane.showMessageDialog(null,"Erro na Conexão com Banco de Dados\n"+ e,"ATENÇÃO",JOptionPane.WARNING_MESSAGE);            
           frmEnderecoBD edb = new frmEnderecoBD(null, true);
           edb.setVisible(true);
           return null;
        }}
        rs.close();
        stmt.close();
        con.close();
        } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "Erro ao consultar... " + e.getMessage());
        }
        return conn;  
       }
}

alguem pode me dar uma :idea: para melhorar o desempenho (velocidade)

11 Respostas

V

Comece usando um profiler e descobrindo onde está o problema:
https://visualvm.dev.java.net/
http://java.sun.com/javase/6/docs/technotes/guides/visualvm/profiler.html

E

N@lldo:
boa tarde galera

tenho um sistema em que roda na rede e na net… porém, o desempenho via net está baixo.
meu sistema foi desenvolvido com java + mysql obs.: desktop

Deve estar mesmo, porque
a) Não se deve abrir bancos de dados diretamente na Internet
b) Na eventualidade de você fazer isso (que perigo!) você não deve ficar abrindo e fechando as conexões a toda hora, porque isso é demorado em rede local e mais demorado ainda na Internet. Use um pool de conexões como o C3PO ou o DBCP.

N

agradeço pela atenção de vcs!

entanglement voce tocou em um assunto que muito me interesa…
realmente minha conexão ta uma loucura rsrss… esta sempre abrindo e fechando.

entanglement pesso humildemente uma ajuda para organizar minha conexão…
eu procurei em varios lugares e nao encontrei um passo a passo para desenvolver um pool de conexão, pois, nao sei por onde começar :roll:
obs.: meu sistema java+mysql “desktop”

V

Quando fiz um sistema com essas características, fizemos o seguinte:

a) Deixar o gerencimento de abrir e fechar conexões para o Spring. É bem fácil adaptar seu sistema para sair do JDBC comum e usar o Spring. O código fica mais simples, vale a pena (pense que com o Spring vc não precisa ficar criando esses try…catch…finally);
b) Usamos o Jakarta DBCP. Ele simplesmente fornece um novo objeto de DataSource e as conexões que ele retorna são automaticamente colocadas no pool quando o método close é chamado.

Mesmo que você não use o Spring, é extremamente simples com o Jakarta. Na verdade, seu código praticamente não muda, só o que muda é o DataSource das conexões.

Abaixo um exemplo do Jakarta DBCP:
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/doc/BasicDataSourceExample.java?revision=897457&view=markup

N

ViniGodoy acompanho esse forum a um ano e meio… nesse periodo pude observar que vc ajudou bastante iniciante (meu caso) parabéns

bom… para eu usar o jakarta DBCP
1º tenho q baixar algum driver
2º tenho q mudar minha classe de conexão igual ao exemplo q vc me enviou
3º tenho q inserir os DataSource no meu projeto

V

Provavelmente só a classe Conecta_ACESS vai mudar.

Ela vai usar o BasicDataSource para criar as conexões, como no exemplo que te passei. O que é legal, é que a conexão do Pool também implementa a interface connection. Quando vc chamar o close() de uma conexão que está no pool, ao invés de fechar, ela simplesmente volta para o pool… O que significa que seu código, que usa o Connection, não muda nada.

V

Driver não. Só o .jar do jakarta DBCP.

Sim, mas veja, não muda quase nada.

Um único DataSource, dentro da sua classe Connecta_ACCESS…

N

Sei q o ViniGodoy tentou simplificar pra mim como fazer conexao de pool, porem, ainda nao consegui fazer a mudança :oops:

nunca tive tanta duvida a respeito de uma coisa que parece ser tão simples...
será que e possivel manipular essa minha classe de conexão para q ela possa fazer uma conexão de pool

package padrao;   
import java.sql.*;   
import javax.swing.JOptionPane;   
  
public class conecta {   
  
public conecta() {}   
       Connection conn = null;   
public Connection conecta(){   
        Conecta_ACCESS conexao = new Conecta_ACCESS();   
        try{   
        Connection  con = conexao.conect();     
        Statement stmt = con.createStatement();   
        String procura = "select * from tbl_caminho where CODIGO="+ 1;   
        ResultSet rs = stmt.executeQuery(procura);             
       while(rs.next()){           
        String ip = rs.getString("ENDERECO");//busca endereço(ip) no bd acess   
        //String driver = "org.gjt.mm.mysql.Driver";   
        String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC   
        String banco = "bdrn"; //Nome do Banco criado   
        String host = ip; //Maquina onde está o banco   
        String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão   
        String usuario = "root"; //Usuário do banco   
        String senha = "nalldo36"; //Senha de conexão   
        try {   
           Class.forName(driver); //Carrega o driver   
           conn = DriverManager.getConnection(str_conn, usuario, senha);   
        }catch(ClassNotFoundException e){   
           JOptionPane.showMessageDialog(null,"n Driver não encontrado!\n"+ e,"ATENÇÃO",JOptionPane.WARNING_MESSAGE);   
           return null;   
        }catch(SQLException e){   
           JOptionPane.showMessageDialog(null,"Erro na Conexão com Banco de Dados\n"+ e,"ATENÇÃO",JOptionPane.WARNING_MESSAGE);               
           frmEnderecoBD edb = new frmEnderecoBD(null, true);   
           edb.setVisible(true);   
           return null;   
        }}   
        rs.close();   
        stmt.close();   
        con.close();   
        } catch (SQLException e) {   
        JOptionPane.showMessageDialog(null, "Erro ao consultar... " + e.getMessage());   
        }   
        return conn;     
       }   
}

obrigado :roll:

V

A classe que vai mudar é a Conecta_ACESS(), não essa. Posta o código da Conecta_ACCESS aqui.

N
import java.sql.*;
import javax.swing.JOptionPane;
public class Conecta_ACCESS {
    
    public Conecta_ACCESS() {    }
    private String url = "jdbc:odbc:Endereco";
    private String driver ="sun.jdbc.odbc.JdbcOdbcDriver";
    private String user ="naldo"; 
    private String pwd = "nalldo36";//Senha do Banco de dados
    Connection con = null;    
     
    public Connection conect(){
        try{
            Class.forName(driver);
            con = DriverManager.getConnection(url, user,pwd);            
        }catch(ClassNotFoundException e){
            JOptionPane.showMessageDialog(null,"Ocorreu um erro no sistema, se o problema persistir contate o administrador:\n Driver n�o encontrado!\n"+ e,"ATEN��O",JOptionPane.WARNING_MESSAGE);
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null,"Ocorreu um erro no sistema, se o problema persistir contate o administrador:\n Erro na Conex�o com Banco\n"+ e,"ATEN��O",JOptionPane.WARNING_MESSAGE);            
        }
        return con;  
    }
}
N

ViniGodoy nao desista de me ajudar :lol:

Criado 6 de julho de 2010
Ultima resposta 6 de jul. de 2010
Respostas 11
Participantes 3