Olá.
Caros colegas, estou com uma aplicação programaga com um while para executar uma buscar no banco de dados a cada 5s. Isso ocorre na tela administrativa onde o usuário tem acesso as vendas feitas no dia.
Gostaria de saber se tem como fazer essa atualização da tabela de forma automática quando uma nova venda foir feita, e, somente se houver uma nova venda feita. Para não ter que usar a rede a cada 5s sem necessidade.
Espero que isso esteja em uma thread separada.
Sim, tem. Basta você criar uma estrutura de comunicação entre o processo de venda e esse processo. Um gatilho, basicamente.
É um sistema desktop ou web?
Desktop. Como me aconselha a fazer isso com dois desktops diferentes(Um de vendas e o do Administrador)?
Cara, normalmente isso é feito com sockets.
Vc pode resolver isso usando map.
public abstract class MonitorVendas{
public final Map<String, Boolean> monitor = new HashMap<>();
public void addAdministrador(String nome){
monitor.put(nome, false);
}
//...Demais métodos por sua conta
}
public void registrarVendas(List<Venda> vendas){
Vendeu
Atualizar todas as chaves do mapa:
MonitorVendas.entrySet().forEach(entry -> entry.getValue().setaValue(true));
}
Após o tempo determinado, vc consulta o map e só consulta o banco de dados se o map tiver a informação de que houve uma venda.
public boolean vendeu(String user){
return MonitorVendas.monitor.get(user);
}
public List<Vendas> consultarVendas(String user){
if(vendeu()){
consultar no banco de dados o id da última venda consultada, vai precisar de uma tabela que armazene quem consultou e o id da última venda consultada
Pode usar uma stored procedure para as ações de consulta e atualizar a tabela do user contendo o id da última venda e a referência de quem consultou
MonitorVendas.get(user).setValue(false);
}
retornar a lista de novas vendas, mesmo vazia
}
Pesquise sobre stored procedures, com uma única vc pode:
a) realizar a consulta das vendas realizadas;
b) armazenar em uma tabela à parte o user e o id da última venda consultada;
c) não vai enviar para o cliente aquilo que ele já possui;
d) reduz o trafego;
e) otimiza o banco;
f) racionaliza as queries; etc
Outras variações podem ser pensadas como receber o id da última venda do cliente, mas depende do objetivo desejado.
Olá, mano. Sua ideia me parece muito boa e ia pesquisar agora sobre ela. Mas antes me tira mais uma dúvida:
Como fazer isso sendo que vou usar dois pcs diferentes(SERVIDOR/CLIENTE)?
https://respostas.guj.com.br/51862-como-fazer-minha-aplicacao-java-cliente-servidor-se-comunicarem
Infelizmente só conheço a implementação por meio de sockets.
Mas é trabalhoso.
Se vc adotar a arquitetura web é mais fácil.
Pesquise sobre graphql e REST.
Acho que estão não promoção na udemy.
Por exemplo, com REST vc manda o pedido para um método em particular.
Com sockets é trabalhoso sobremaneira.
Procure por websockets, vai ser melhor que sockets.
Ainda assim, web é mais tranquilo.
Se a rede for local, tem que liberar o firewall.
Entre rest e graphql creio que o graphql seja mais interessante.
Se estiver com dificuldade, outra alternativa é criar uma tabela no banco de dados e quando houver uma venda, vc atualiza está tabela com o id da última venda e o id da última consulta realizada pelo cliente.
Depois vc consulta esta tabela.
Basta liberar o firewall e conectar direto com o banco.
Depois vc analisa qual a melhor implementação para o servidor.
Veja, software funcionando é importante.
À medida que ests aplicação cresce ela justifica mais investimentos nela.
Assim, sendo uma aplicação local, conecte o cliente no banco de dados, depois vc analisa o que precisa.
Com stored procedures, quando uma venda for feita, vc atualiza a tabela.
Mas isso não parece bom pois imagine um grande volume de vendas e uma compra esperando a liberação dessa linha da tabela.
Depois procure por data warehouse, vc vai entender que não se deve fazer análises em cima desse banco de dados.
‘Pedreiro’, isso é meio o que eu já faço na minha aplicação com um timer, que a cada 5s ele atualiza a tabela no frame com as informações da tabela tab_os no banco de dados.
Toda vez que uma venda, entrada, saída, ou qualquer outra coisa que implique dinheiro o sistema grava as informações na tabela referente a ele(no caso das vendas ele grava também na tabela venda), e ba tabela tab_os que são onde ficam todas as movimentações.
Eu queria não condicionar a aplicação a atualizar somente se o usuário mandar ou a cada x segundos. E sim criar uma maneira de que a venda em si possa fazer isso estando em terminais diferentes na rede.
Usando o timer eu já consigo fazer isso até mesmo com os dois pcs em redes diferentes via interet.