Disparar uma consulta no banco em determinado período de tempo

11 respostas
P

Olá pessoal, estou com uma aplicação que faz o seguinte, é um Jframe que quando o usuário clica em um botão dispara uma consulta no banco. Eu gostaria que, quando a aplicação fosse iniciada, a aplicação fizesse a consulta e ficasse repetindo automaticamente em determinados períodos de tempo. É possível? Como?

11 Respostas

FernandoFranzini

Sim… use a classes Timer e TimerTaks para fazer um agendamento de processos de tempos e tempos…dai vc implementa oque deseja fazer…
http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/threads/timer.html
http://enos.itcollege.ee/~jpoial/docs/tutorial/essential/threads/timer.html

F

Se você não quiser por horário e sim por segundos.
Por exemplo: de Dez em dez segundo faça uma chamada no banco.

for(int i = 0; i <= 10;i++){
		//Inicia acontagem dos segundos... Quando contar 10 segundos sai do laço e chama o método.
		try{
			
			Thread.sleep(1000);
			
		}catch(Exception ee){
			
			System.out.println("Erro na execução do tempo.");
			
		}
		System.out.println(i + "  -  Segundo(s)");
		if(i == 10){
			
			i = 0;
			//Aqui vc chama o método que faz a consulta do banco.
		    te.segundos();
			
	}
	
	
}
rmendes08
felipevs:
Se você não quiser por horário e sim por segundos. Por exemplo: de Dez em dez segundo faça uma chamada no banco.
for(int i = 0; i <= 10;i++){
		//Inicia acontagem dos segundos... Quando contar 10 segundos sai do laço e chama o método.
		try{
			
			Thread.sleep(1000);
			
		}catch(Exception ee){
			
			System.out.println("Erro na execução do tempo.");
			
		}
		System.out.println(i + "  -  Segundo(s)");
		if(i == 10){
			
			i = 0;
			//Aqui vc chama o método que faz a consulta do banco.
		    te.segundos();
			
	}
	
	
}

Não entendi o porque dessa complicação , não seria mais fácil usar :

while(true){
  try{
      Thread.sleep(10 * 1000);
  }catch(Exception ee){
      System.out.println("Erro na execução do tempo.");
  }

   executeQuery();
}

logo de uma vez ?

De qualquer maneira, eu acho o uso do Timer mais limpo, ainda mais em uma aplicação Swing.

Em segundo lugar , eu pensaria com carinho se ficar consultando o banco de dados toda a hora faz realmente sentido, isso é praticamente o inverso do caching de entidades (ou tabelas). Ou seja, vai na contra-mão de tudo o que é feito para ganho de desempenho em uma aplicação.

FernandoFranzini

Fazer while infinito é na verdade gambiarra…use Timer e TimerTask que foi feio justamente para isso…

L

Cria um Stateless Bean com um Timer Service.

FernandoFranzini

Não da para fazer isso dentro de uma aplicação Swing… :?

L

Não da para fazer isso dentro de uma aplicação Swing… :?

Mals :roll:, não tinha visto que era Swing.

P

Tentei de diversas maneiras inserir seu código ao meu mas me parece que entra em um loop infinito, a janela trava.

String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC
        String banco = "y"; //Nome do Banco criado
        String host = "192.168.1.115"; //Maquina onde está o banco
        String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão
        String usuario = "pedro"; //Usuário do banco
        String senha = ""; //Senha de conexão
        String agente=jTextField1.getText();
        jTextField2.setEditable(false);
        jTextField3.setEditable(false);
                     
        try 
           {
             Class.forName(driver);
             Connection conn = DriverManager.getConnection(str_conn, usuario, senha);
             Statement stmt = conn.createStatement();
             String sql = "SELECT destino  FROM active_calls where agente = '" + agente + "'";
             ResultSet rs = stmt.executeQuery(sql);
             
             if (rs.next()){
                String destino= rs.getString("destino");
                jTextField2.setText(agente);
                jTextField3.setText(destino);
             }
             else {
                jTextField2.setText("");
                jTextField3.setText("");
                JOptionPane.showMessageDialog(null, "NUMERO NÃO ENCONTRADO!", "", JOptionPane.WARNING_MESSAGE);
             }
           }
           catch (ClassNotFoundException ex) 
           {
             System.out.println("Não foi possível carregar o driver.");
             ex.printStackTrace();
           }
          catch (SQLException ex) 
           {
             System.out.println("Problema com o SQL");
             JOptionPane.showMessageDialog(null, "Não foi possivel conectar ao banco de dados","", JOptionPane.ERROR_MESSAGE);
             ex.printStackTrace();
           }
FernandoFranzini
while(true){

try{

Thread.sleep(10 * 1000);

}catch(Exception ee){

System.out.println(Erro na execução do tempo.);

}

executeQuery();
}

Se vc for fazer essa bobagem, tem que fazer numa thread separada !!! na mesma thread vai travar mesmooooo!!! :?

MarcioCasteloBranco

Vc tera que sincronizar as threads que gerenciam o swing com a sua !

MarcioCasteloBranco

Vc pode adotar uma outra extrategia, toda vez que for feito uma alteração ou exclusão no seu BD(em sua tabela) vc pode utilizar um observe(padrao de projeto) para atualizar a sua frame.

Criado 14 de julho de 2011
Ultima resposta 14 de jul. de 2011
Respostas 11
Participantes 6