Ajuda com a conexão

7 respostas
Zeed01

Boa tarde colegas !!!

Estou com um dúvida sobre onde e quando fazer a conexão com o BD.

Tenho uma classe chamada ConectionFactory responsável por criar uma conexão e retornar a classe que solicitou.

package com.atm.DAO;
 
 import atm.*;
 import java.sql.*;
 import javax.swing.JOptionPane;
 
 public class ConnectionFactory {        
 
 	public static java.sql.Connection getConnection () {
                 Connection conn = null;
 		try {
                         /*Conexão MySql*/                       
 			Class.forName("com.mysql.jdbc.Driver");
 			System.out.println("Conectando ao banco MySql...");
                    
 			conn = DriverManager.getConnection("jdbc:mysql://999.99.999.99/DB","XXXX","XXXXXX");                        
                         
                         System.out.println("Conectado ao banco MySql...");
                         return conn;
 		} catch (ClassNotFoundException e){
                         JOptionPane.showMessageDialog(null,"Falha na conexão com o banco de dados \n" + e.getMessage()) ;
                         e.printStackTrace();
 		} catch (SQLException e ) {
                         JOptionPane.showMessageDialog(null,"Falha na conexão com o banco de dados \n" + e.getMessage()) ;
                         e.printStackTrace();
                 }
                 return null;
         }
 }

Tenho telas de cadastro para duas tabelas, Usuario e Perfil, sendo que gerei duas classes DAO, respectivamente UsuarioDAO e PerfilDAO, em cada uma dessas classes tenho um método Conecta():

public class PerfilDAO {
     private static Connection conn = null;
     private static Statement st;
     private static PreparedStatement stp;
     private static ResultSet rs;    
 
     private static void conecta(){
         try {
             if (conn == null) {
                 conn = ConnectionFactory.getConnection();   
                 conn.setAutoCommit(false);
             } else 
                 System.out.println("Conexão ja existe.");
         } catch (SQLException ex) {
             ex.printStackTrace();
         }        
     }

Bom finalmente minha dúvida:
Da maneira que fiz se eu abrir a tela de Cadastro de Usuario crio uma conexão, ao abrir a tela Cadastro de Perfil crio outra conexão.

Isso esta correto ?
Considerando que a conexão com o banco é uma parte custosa para a aplicação, como poderia criar somente uma conexão para todo o sistema ? E isso funciona ?

Obrigado a todos !

[]s

7 Respostas

fabiel

Brother seria interessante se vc criasse uma conexão apenas qnd clicar no botao inserir, pois vc ja tera preenchido os objetos sem ter aberto a conexao. Depois de preenchido so passa o objeto para o DAO e este cria a conexão e logo en seguida fecha. Da uma estuda no designer pattern DAO !!!
qualquer duvida eh so postar

Zeed01

fabiel:

Antes de mais nada obrigado pela força…
Acho que não falei que estou trabalhando numa aplicação desktop, então, quando o usuário entra numa tela de cadastro, de Usuário por exemplo, aparecem todos os usuários cadastrados, com botões de navegação primeiro, próximo, anterior e ultimo, e botões Novo, Gravar e Excluir.

Sendo assim quando entra na tela a aplicação tem que recuperar todos os usuarios cadastrados.

Se eu for criar a conexão somente quando clicar nos botões Gravar e Excluir não irei aumentar o problema ? Quer dizer… se eu clico em Novo e depois de preencher clico em Gravar arco com o custo (leia-se demora) de abrir uma conexão.

Se na sequencia clico em Excluir la esta o mesmo custo…

Não sei se consegui ser claro…
Eu andei lendo sobre pool de conexões mas sinceramente não consegui entender como seria a implementação.

Obrigado.

[]s

fabiel

Aew Brother o designer Pattern DAO eh tanto para web quanto para Desktop.

Para o seu primeiro problema eh simples.

Quando vc abrir a tela usuario vc abre a conexao com o banco, usa uma list para guardar o resultado do banco assim vc podera manipular do jeito que vc quer e logo que a list estiver preenchida o DAO automaticamente fecha a conexao.

Entao vc podera usar as variaveis e armazenar num objeto e quando desejar inserir o DAO abre outra conexao.

E na sua tela onde havera proximo, excluir etc… estes funfa da mesma forma sempre q um evento disparar o DAO abre e fecha a conexao.

E a respeito de demora nao vejo problema isso eh imperseptivel

aew ajudou ?

Zeed01

Opa… com certeza ajudou !

Acho que eu estou usando algo como vc explicou, só não estou fechando a conexão depois de montar a lista.

Eu tenho uma variavel do tipo Connection, se ela for igual a Null eu crio uma conexão, se não for uso a que já existe.

Então esta funcionando assim:

-Entro na tela (CadastroUsuario.java)
-Esta classe cria um objeto UsuarioControl, que possui uma lista com os usuarios e devolve para a tela o usuario atual.
-UsuarioControl cria uma conexão, solicita os usuarios cadastrados ao BD e cria uma lista, depois devolte para a tela o usuario atual (que deve ser mostrado)
-Ao clicar em proximo, anterior, etc, a tela solicita ao objeto UsuarioControl o proximo, anterior, etc, UsuarioControl anda na lista que ja existe atualiza o Usuario atual e devolve para a tela.
-Ao clicar em gravar, a tela passa para o UsuarioControl um objeto usuario para ser persistido no BD (na verdade quem faz a persistencia é outra classe, chamada UsuarioDAO).

Me parece que a diferença é que eu crio a lista e mantenho a conexão aberta. Quando o usuario pede para fazer uma inclusão ou uma exclusão eu uso a mesma.
Fiz isso porque, pelo que li, achei que abrir e fechar a conexão iria gerar lentidão no sistema…

[]s

fabiel

Aew sobre lentidao quase nao se nota. Pode comparar com a web, quando vc se loga o sistema abre a conexao verifica e depois fecha isso é feito para agilizar, inton pq nao fazer em desktop !!!

Espero ter ajudo e qualquer coisa eh so postar !!!

S

Cara, só uma pergunta, estava acompanhando o tópico mas ainda estou com algumas dúvidas:

  1. É eficiente salvar a tabela inteira em alguma list na aplicação? (Transferir do banco de dados para a memória).

  2. Tem algum momento onde acho que mesmo sendo eficiente essa prática pode ser ineficiente - como posso medir quando chegou essa hora?

  3. Quais são as outras opções ao sistema citado à cima? Creio que ir lendo do banco de dados “On-Demand”?

Zeed01

scarvenger

Acho que nada impediria que nessa aplicação eu buscasse um usuário por vez, no entanto, para este caso, acho que não compromete o desempenho e atende a um requisito do cliente.

Se a quantidade de registros que serão carregados no List for muito grande então acho que uma outra abordagem é necessária.

[]s

Criado 26 de junho de 2007
Ultima resposta 27 de jun. de 2007
Respostas 7
Participantes 3