bom tou pensando em criar uma rotina para ficar fazendo alert a cada novo registro em uma tabela
mas eu estou com dúvida como eu conseguiria fazer essa verificação se um novo registro foi adicionado a uma determinada tabela?
é possível?
alguém poderia me dar um exemplo?
mas vc poderia me dar um exemplo da estrutura?
de como saber se um novo registro foi adicionado?
L
Lucas_Camara
Esse alert seria o alert do javascript na tela mesmo? Se sim, vc quer esse alert quando o usuário acabar de registrar algo nessa tabela ou que qualquer outro usuário logado no sistema receba o alert avisando que algum produto foi registrado por algum outro usuário?
L
LostSpirit
Eu tenho categorias ex user normal
e adm
eu queria fazer uma rotina para ter um alert sempre que um regsitro novo for insediro em uma tabela chamada requisições
mas eu n faço ideia como faria essa checagem no sql
eu tenho alguns atributos nessa tabela como date time de quandp é criado.
C
Cleiton_Conceicao
ahh… então uma trigger não resolve seu problema.
tu pode criar uma função recursiva definindo o segundos/minutos etc que ela será executada ,verificando se foi adicionado novos registros.
porém essa forma irá consumir muito do servidor, a melhor forma é utilizando websockets.
L
LostSpirit
entendi vou procurar sobre
mas sobre essa verificação você pdoeria me dar uma luz de como eu faço?
pois eu n estou conseguindo pensar em algo.
J
Jonathan_Medeiros1 like
Você pode fazer um timer que executa de tempo em tempo disparando uma consulta e verificando se existe o registro que você está procurando!
Exemplo:
importjava.util.Timer;importjava.util.TimerTask;publicclassExample{publicstaticfinallongTIME=(1000*60);//Tempo configurado fará com que execute a cada 1 minuto publicstaticvoidmain(String...args){System.out.println("Iniciou a execução...");Timertimer=null;if(timer==null){timer=newTimer();TimerTasktask=newTimerTask(){publicvoidrun(){try{System.out.println("Executando a tarefa agendada no tempo configurado...");//Colocar seu código de verificação do registro que está analisando}catch(Exceptione){e.printStackTrace();}}};timer.scheduleAtFixedRate(task,TIME,TIME);}}}
L
LostSpirit
Opa então eu pensei em fazer isso o problema é que já procurei como eu conseguiria fazer essa verificação de quando um novo registro for inserido em uma determinada tabela e não consegui achar nada sobre.
J
Solucao aceita
Jonathan_Medeiros1 like
Simples, imagina o seguinte!
Ao executar o comando SQL count da tabela, você vai obeter o total de registros que essa tabela possuí inicialmente, certo?
SELECT COUNT(*) FROM MINHA_TABELA;
Tendo esse valor em mãos, ao executar uma verificação de tempo em tempo, quando essa consulta retornar um valor maior que o anterior recuperado isso significa que um novo registro foi inserido.
Porém você deve pensar também que se houver exclusões nessa tabela o valor de comparação também deve ser atualizado, para que o código funcione corretamente!
O jeito mais simples é saber que tipo de registro você está esperando e consultar por esse registro único na tabela, dessa forma você sempre garante a obtenção do resultado esperado independente da quantidade de registros contidos na tabela.
Você nunca vai encontrar nada pronto que resolva o seu problema, você tem que entender o problema e pensar na melhor solução, no máximo na internet você vai conseguir exemplos de coisas parecidas para ter como base, olhe os exemplos, faça experimentações com o seu cenário e crie a sua solução de acordo com o que você espera.
L
LostSpirit
Vlw mano vou tentar fazer
você poderia tirar só mais uma dúvida?
Seria melhor utilizando esse timer ou utilizando o quartz?
ambos seriam a mesma coisa?
J
Jonathan_Medeiros1 like
Depende muito do contexto de aplicabilidade, no seu caso acredito que o TimerTask já atende bem, o Quartz trás muitos outros recursos de nível funcional que você vai acabar não utilizando, mas caso queira utilizar por questões de conhecer e praticar não vejo problema algum nisso, os dois atendem.
J
Jhonatas_Tomaz1 like
Bom o trigger atenderia pois ele verifica na base de dados se foi adicionado um novo registro ou não porque toda vez que um registro é adicionado é disparadi um função e se o trigger está ativo para perceber esta função ele vai ser acionado.Porque se usar o TimerTask você terá de fazer várias implementações para quando um registro for deletado e até mesmo mudado e outra que isso iria pesar o seu servidor
L
LostSpirit
Você poderia me dar um exemplo de como eu perceber essa função com uma trigget man?
Poderia explicar melhor como funcionaria utilizando trigger, somente a nível de curiosidade e para fins de conhecimento?
Porquê eu acredito que não atenderia, veja bem, mesmo tendo uma trigger criada e configurada para ser acionada nos eventos INSERT/UPDATE/DELETE da tabela em questão, nesse caso em específico ele precisa exibir um alert na aplicação sempre que for identificado um novo registro na tabela, não vejo como uma trigger poderia atender este recurso, até por isso sugeri a rotina que verifica de tempo em tempo se a quantidade de registros na tabela foi alterada.
A única situação em que vejo a possibilidade de uso da trigger seria ele ter uma tabela de apoio em que, quando a trigger for acionada pelo evento INSERT da tabela requisição, a mesma insira um novo resgistro nessa tabela de apoio, e o TimerTask tratar a verificação em cima dessa tabela de apoio, que seria mais simples do que tratar pela tabela requisição somente.
J
Jhonatas_Tomaz
Bom em aplicação onde se utiliza nem necessita de trigger no próprio react e com bibliote as dq pra retornar o alert
J
Jhonatas_Tomaz
No java eu não sei implementar muito bem o trigger mais sei que tem como.Pois ja vi fazerem isto.Porque se usassem o timertask teria que toda a hora executar uma consulta sql no banco e isto pesaria muito a aplicação.Vou dar umas pesquisadas a mais depois respondo melhor como implementar corretamente no java. Ai um link do javadocs https://docs.oracle.com/cd/B19188_01/doc/B15920/jdbc.htm
J
Jonathan_Medeiros1 like
Depende de quanto em quanto tempo se é disparada a rotina, e depende de qual consulta é executada, cada caso é um caso, há cenários em que pode se usar e há cenários que isso é inviável, mas acredito não ser o caso aqui.
Não entendi o quê você quis dizer, pode explicar melhor?
Esse link é da documentação do JDBC, não entendi a relação dele com o assunto!
J
Jhonatas_Tomaz
Nesta documentação tem alguns métodos que verifica se o dado foi adicionado ou não tipo o Rowinserted que pode ser usado.Vou ver isto melhor e verificar mais as coisas.Na verdade se for utilizar o javascript se fir pra infirmar todos que ym registro fou adicionado pode utilizar uma biblioteca que quando chamar o método insert disparar uma ação no backend para todos verem
J
Jonathan_Medeiros
Esse cara se não me engano precisa de um ResultSet, e um ResultSet é alimentado a partir de uma consulta, e esse método só funciona se o BD utilizado fornecer suporte de estados das linhas da tabela, mas acredito que o uso dele não cabe no contexto deste problema.
J
Jhonatas_Tomaz1 like
Sim é examente isto.Esqueçi que não se aplica ao contexto. Só que se for em java que ti er programando a aplicação dá pra verificar se o objeto for inserido utilizando uma variàvel do tipo boolean e colocar pra receber no métodod inserir e depous faz uma comparação com if que se foi inserida retorna os objetos passados senão retorna nulo
J
Jonathan_Medeiros1 like
Esse cenário aqui funciona em instâncias únicas da aplicação, se você imaginar uma rede de múltiplos usuários conectados e gerando informações a todo momento, se a notificação precisar ser disparada para N usuários, esse tipo de tratativa não resolveria o problema!
Por isso a ideia de usar um TimerTask de verificação, porque de tempo em tempo independentemente da quantidade de instâncias da aplicação e da quantidade de usuários, ela sempre vai executar a rotina de verificação e disparar a notificação.
Não necessariamente precisa ser o TimerTask, tem outras API’s semelhantes que também atendem, como já foi discutido mais acima no tópico, aí nesse ponto é mais uma questão de necessidade X solução.
J
Jhonatas_Tomaz
Bom sim mas igual muitos programadores dizem usa a solução que te atenda.Se você acha o TimerTask bom use-o mais se quer desempenho pesquise um pouco mais
J
Jonathan_Medeiros
Não compreendi sua colocação?!
Poderia expor fatos e dados reais sobre isso? Porquê você afirma isso com tanta certeza? Porquê sinceramente só argumentar por argumentar, não sei para os demais, mas para mim não me diz muita coisa, é tipo juntar nada com coisa nenhuma!
Não estou dizendo que essa é a melhor solução, e sim a solução que atende o problema, acredito que existam outras soluções que cabem aqui, porém as desconheço até então!
Se você conhece uma forma melhor, mais simples, diferente, ou qualquer que seja por gentileza compartilhe conosco!
Ressalvo, independentemente de tecnologias, se um recurso é utilizado de forma errada ou dentro de um contexto errado o resultado é espelho o disso, da mesma forma que o uso correto do recurso certo dentro do contexto certo também reflete um ótimo resultado!
J
Jhonatas_Tomaz
Igual eu falei tem sim como resgatar os valores do trigger.Se quiser em outros fóruns e pergunte siceramente eu não sei muito bem como implementar num projeto java mais sei que tem como. E depois irei postar aqui
L
LostSpirit
Opa eu vou fazer pelo task mesmo
no caso se eu quiser chamar em todas a aplicação eu preciso utilizar o metodo em todas stages?
J
Jonathan_Medeiros1 like
Cara eu não conheço praticamente nada de JavaFX pra te aconselhar, mas assim, você deve colocar isso onde realmente for atender a necessidade, isso tem que estar claro pra ti!
L
LostSpirit
opa man eu criei uma variavel só para guardar a qtd de registros
mas estou c dúvida em como fazer essa verificação
se tem um registro a mais ou a menos
try{StringverStatus="SELECT COUNT(*) FROM equipamento_requisicao";PreparedStatementstmt=conn.prepareStatement(verStatus);ResultSetrsStatus=stmt.executeQuery();rsStatus.next();intResultado=rsStatus.getInt(1);
no caso eu teria que pegar esse valor ao validar o login e guardar uma variavel e depois fazer a comparação com essa variável resultado?
teria como vc me dar uma luz ?
J
Jonathan_Medeiros1 like
A ideia seria exatamente essa, aí sempre que for identificado uma mudança de quantidade de registros, atualizar o valor dessa variável de comparação!
A condição para disparar a notificação seria: valorRetornadoDaConsulta > valorVariavelDeComparacao, isso indicaria que um novo registro foi inserido na tabela.
L
LostSpirit
no caso eu tenho um singleton eu poderia utilizar esse valor lá?
Ou seja cada vez que se verificar um registro novo
ou um registro a menos eu setaria guardaria esse valor nela?
J
Jonathan_Medeiros1 like
É que não sei como está o contexto da sua aplicação, mas se colocá-la lá atende, não vejo problema nisso!
Sim, porquê somente tendo esse valor em mãos a comparação será efetiva e terá o resultado esperado.
L
LostSpirit
Tipo eu tenho um singleton onde eu guardo todas informações relacionadas ao usuario, é tipo um session, então eu não sei é necessário criar isso no singleton, eu não consegui pensar em outra maneira, criar um construtor e passar como parametro em todas as stages, existe algum outro modo para fazer isso ( uma forma mais correta ), pois nesse caso eu teria que ficar setando esse valor no singleton quando tivesse uma alteração .
ahh se você pdoesse me dar uma ajuda
eu utilizo bastante isso, mas não sei ao certo qual nome se dar a essa prática:
transformar o objeto em uma static na tela login por exemplo private static Sessao aSessao;
e então utilizar o aSessao para chamar os metodos da classe sessão
queria dar uma estudada a mais sobre, " não sei muito bem o conceito, mas sei como utilizar, eu queria pegar o conceito e aprender mais sobre "
desde já agradeço pela ajuda e desculpa por esse tanto de perguntas, creio que comecei a da forma errada tinha conhecimentos básicos em java e ao invés de ir assistir video aulas ou me aprofundar no tema já comecei tentando na prática sem nenhum conceito (" mas eu acho que consigo pegar mais na prática ")
J
Jonathan_Medeiros2 likes
Não consegui compreender muito bem o que tu disse, você sabe que um Singleton é um design pattern?
Posso ter N classes no projeto utilizando o pattern Singleton, Pojo, DAO, Controller, Service, Handler, Validator e por aí vai…
Sobre as Stages que já entram no âmbito do JavaFX, não tenho a mínima ideia do que são e como funcionam, em outras palavras “não sei se é de comer ou de passar no cabelo” rs.
Posso tentar elaborar um exemplo, mas seria somente com Java puro, como te disse antes para poder te aconselhar melhor com as dúvidas de onde por esse código e coisas assim eu teria que conhecer JavaFX, entender sobre o ciclo de vida dos objetos dele, usabilidade e aplicabilidade, coisas assim.
Sobre isso aqui, sem problemas, sinta-se a vontade para tirar suas dúvidas, mas uma coisa que te recomendo fortemente é, não pule etapas de estudo, se você sabe que te falta alguns conhecimentos e domínios básicos, pare tudo que está fazendo e volte para o básico, evolua a partir dele com o tempo, pular etapas não vai te trazer nenhum benefício, estude os conceitos, aprenda os conceitos e os aplique na prática com exemplos, sempre um conteúdo de cada vez, e com o tempo você vai perceber que eles mesmos vão se encontrando sozinhos conforme você avança os estudos.
L
LostSpirit
vlw manoo, consegui fazer utilizando o singleton e vou começar a dar uma aprofundada em conceitos
em relação a isso:
private static Sessao aSessao
e utilizar
aSessao. para obter o metodos
tornar esse objeto statico e utilizar em outras classes para chamar a minha sessão
qual o nome desse conceito?
J
Jhonatas_Tomaz1 like
Geralmente quando eu faço uma classe pra montar a tela do javaFx eu uso métodos getStage e set Stage.
Obs:Sei que não é 100% correto mas uso porque é majs fâcil de implementar
J
Jonathan_Medeiros1 like
Se você cria a instância internamente na classe e faz o uso dela através do static esse é o pattern conhecido como Singleton, é muito usado com classes utilitárias.
Lembrando, só o fato de definir na declaração como static quer dizer que você quer que aquele cara pertença a classe e não ao objeto.
L
LostSpirit
opa man vlw
eu tenho um singleton
eu consegui fazer todas as verificações:
StringverStatus="SELECT COUNT(*) FROM equipamento_requisicao";PreparedStatementstmt=con.prepareStatement(verStatus);ResultSetrsStatus=stmt.executeQuery();rsStatus.next();intResultado=rsStatus.getInt(1);if(Resultado>Sessao.getInstancia().getQtdRegistroBD()){Sessao.getInstancia().setQtdRegistroBD(Resultado);//meualert}elseif(Resultado<Sessao.getInstancia().getQtdRegistroBD()){Sessao.getInstancia().setQtdRegistroBD(Resultado);}else{//aqnãoireifazernada.}
creio que isso seja suficiente para o que estou precisando.
mas estou com uma dúvida eu fiz esse metodo em um DAO
eu tou com dúvida onde eu chamaria esse timer para ficar fzd essa rotina.
E também eu estava pensando em criar uma tabela auxiliar para guardar essas qtd’s de registros e o id do usuario
ex:
quando o usuário fechar a instancia salvar no banco de dados a qtd de registros no momento que ele fechou e o id
mas eu não sei se no java é possível chamar um metodo quando o usuario fecha a aplicação ( ex: se o usuario fechar pelo gerenciador de tarefas ou reiniciando o pc etc etc), é possível isso?.