Duvida em concorrência JDBC

5 respostas
andre_a_s

Senhores :D

Tenho um programa não web que executa o seguinte comando no oracle:
SELECT * FROM  USUARIOS WHERE FL_PROCESSO = 'N' and ROWNUM = 1");

Isso fará com que ele traga apenas 1 registro. Ok, td certo, porém, eu terei varias instâncias desse programa rodando.

Quando eu pego um registro, eu passo ele para outra classe e o campo FL_PROCESSO é setado como 'P'. Faço isso para quando outra instancia fizer o select na tabela, nao pegar o cara q eu to usando(que setei o campo como 'P'). O problema é que isso não trata a concorrência 100%.

A minha dúvida é:
Como posso fazer para nao dar problema de um programa pegar o registro que outro ja pegou? Digamos que no meio tempo entre eu fazer o select e setar o valor do campo como 'P', vir outro cara e efetuar o select e pegá-lo? Nesse caso os dois estariam trabalhando com o mesmo registro... e isso quebra as pernas!

A minha app é assim:

public void execute(){

	while(true){
		RegistroDAO dao = new RegistroDAO();
		List<Registro> registros = dao.getRegistrosToDo(); //AQUI PEGO O RESULTADO DO MEU SELECT

		
		for (Registro registro : registros) {
			...
			//AQUI SERIA O PROBLEMA, SE NESSE EXATO MOMENTO
			//UMA OUTRA INSTANCIA FIZER O SELECT, VAI PEGAR
			//O REGISTRO Q ESTOU TRABALHANDO!
			...
			registro.setFlagProcesso("P");
			registro.setDataHoraTentativa(new Date());
			dao.update(registro); // AQUI FACO O UPDATE COM A FLAG 'P'
			
			...
			...
			...
		}
		
	}
}

5 Respostas

A

Como esse programa irá correr?
Referes-te a 2 programas em JVM’s ?

AT®

R

Se é um programa não web, vc terá que usar EJB, ou algo parecido, para pode garantir o sincronismo no lado do EJB.

Do contrário, cada computador que rodar seu software terá uma instância diferente do seu objeto, e não haverá forma de sincronizar as diferentes threads (de diferentes JVMs).

andre_a_s

AdvancedTechnology®:
Como esse programa irá correr?
Referes-te a 2 programas em JVM’s ?

AT®

Seria 1 programa rodando em 1 pc.
Terá uma média de 10 maquinas rodando… entao, seria 10 jvms, cada jvm em um pc diferente.

rodkruger:
Se é um programa não web, vc terá que usar EJB, ou algo parecido, para pode garantir o sincronismo no lado do EJB.

Do contrário, cada computador que rodar seu software terá uma instância diferente do seu objeto, e não haverá forma de sincronizar as diferentes threads (de diferentes JVMs).

Acho q EJB não seria necessario. Funcionaria, mas seria coisa demais pra uma coisa simples.
Pensei em algo do tipo… quando eu pegar o registro, se eu executar um “BEGIN TRANSACTION”, ele “tranca” o registro comigo, não? Ai no caso o proximo que pegasse, daria exception, ai ele teria q pegar outro registro.

O

Não dá para chamar uma stored procedure que faça o select e o update?

Se for Oracle dá para usar SELECT FOR UPDATE.

P

Estou procurando uma solução para o mesmo problema, mas estou trabalhando com um aplicativo simples, por isso não queria utilizar EJB também.

Ninguém mais tem dicas ai que possam ser úteis?

Criado 12 de abril de 2007
Ultima resposta 13 de abr. de 2007
Respostas 5
Participantes 5