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?
Disparar uma consulta no banco em determinado período de tempo
11 Respostas
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
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();
}
}
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.
Fazer while infinito é na verdade gambiarra…use Timer e TimerTask que foi feio justamente para isso…
Cria um Stateless Bean com um Timer Service.
Não da para fazer isso dentro de uma aplicação Swing… :?
Não da para fazer isso dentro de uma aplicação Swing… :?
Mals :roll:, não tinha visto que era Swing.
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();
}
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!!! :?
Vc tera que sincronizar as threads que gerenciam o swing com a sua !
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.