Dúvida em relação a código SQL?

37 respostas Resolvido
sql
LostSpirit

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?

37 Respostas

Cleiton_Conceicao

Tu pode fazer com trigger…
Evento after insert…

LostSpirit

mas vc poderia me dar um exemplo da estrutura?
de como saber se um novo registro foi adicionado?

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?

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.

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.

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.

Jonathan_Medeiros

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:

import java.util.Timer;
import java.util.TimerTask;

public class Example {
	public static final long TIME = (1000 * 60); //Tempo configurado fará com que execute a cada 1 minuto    	

	public static void main(String ... args) {
		System.out.println("Iniciou a execução...");
		Timer timer = null;
		if (timer == null) {
			timer = new Timer();
			TimerTask task = new TimerTask() {
				public void run() {
					try {
						System.out.println("Executando a tarefa agendada no tempo configurado...");
						//Colocar seu código de verificação do registro que está analisando
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			};
			timer.scheduleAtFixedRate(task, TIME , TIME );
		}
	}
}
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.

Jonathan_Medeiros
Solucao aceita

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.

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?

Jonathan_Medeiros

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.

Jhonatas_Tomaz

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

LostSpirit

Você poderia me dar um exemplo de como eu perceber essa função com uma trigget man?

Jhonatas_Tomaz

Dê uma olha neste link está muito fácil de entender
https://www.devmedia.com.br/triggers-no-sql-server-teoria-e-pratica-aplicada-em-uma-situacao-real/28194

Jonathan_Medeiros

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.

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

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

Jonathan_Medeiros

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!

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

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.

Jhonatas_Tomaz

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

Jonathan_Medeiros

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.

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

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!

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

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?

Jonathan_Medeiros

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!

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 {
                                        String verStatus = "SELECT COUNT(*) FROM equipamento_requisicao";
                                        PreparedStatement stmt = conn.prepareStatement(verStatus);
                                        ResultSet rsStatus = stmt.executeQuery();
                                        rsStatus.next();
                                        int Resultado = 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 ?

Jonathan_Medeiros

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.

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?

Jonathan_Medeiros

É 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.

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 ")

Jonathan_Medeiros

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.

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?

Jhonatas_Tomaz

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

Jonathan_Medeiros

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.

Exemplo:

public class MinhaClasse {
    private static MinhaClasse instancia;

    private MinhaClasse() {
    }

    public static MinhaClasse getInstancia(){
        if (instancia == null) {
            intancia = new MinhaClasse();
        } 
        return instancia;
    }
}

Forma de uso:

MinhaClasse instancia = MinhaClasse.getInstancia();

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.

LostSpirit

opa man vlw
eu tenho um singleton

eu consegui fazer todas as verificações:

String verStatus = "SELECT COUNT(*) FROM equipamento_requisicao";
                                        PreparedStatement stmt = con.prepareStatement(verStatus);
                                        ResultSet rsStatus = stmt.executeQuery();
                                        rsStatus.next();
                                        int Resultado = rsStatus.getInt(1);
                                            if(Resultado>Sessao.getInstancia().getQtdRegistroBD()){
                                                Sessao.getInstancia().setQtdRegistroBD(Resultado);
                                                // meu alert
                                            }else if(Resultado<Sessao.getInstancia().getQtdRegistroBD()){
                                                Sessao.getInstancia().setQtdRegistroBD(Resultado);
                                            } else{
                                                //aq não irei fazer nada.
                                            }

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?.

Criado 1 de julho de 2019
Ultima resposta 12 de jul. de 2019
Respostas 37
Participantes 5