Duplicando Registro Usando Struts

5 respostas
F

olá pessoal…

de vez em quando acontece algo estranho na minha aplicação…

qnd o usuário clica em gravar ele grava 2 registros no banco, sendo que o usuário só clicou uma vez no botão…

isso ñ é sempre que acontece…

estou usando jspxstrutsxDAO e banco de dados db2

na view pra inserir um botão na página uso o html:image

já usei o debug pra todo lado e ñ descobri o porque,

já coloquei synchronized pra todo quanto é lugar e nada tb…

alguém já viu isso…

5 Respostas

rockstorm

Voce tentou verificar no seu Struts config se a linha do “save” não esta duplicada??
Ele esta salvando duas vezes, mas sua tabela tem primary key??? Ele esta salvando com primary keys diferentes???

cv1

Outro lugar interessante de olhar eh o request log. Se aparecer duas vezes, bingo: o usuario ta apertando o botao duas vezes.

F

cv eu já fiz o teste clicando somente uma vez e ele duplicou…

rockstorm eu olhei no mapeamento do struts config e tb ñ tem duas linhas com “save”, a chave da minha tabela é o código, acontece que qnd ele volta na segunda vez é gerado um novo código… eu uso sequence do db2 para gerar os códigos…

rockstorm

Coloca a sua action que esta chamando o Save e a classe de acesso ao banco para olharmos…

F

esse método é o q chama a classe de negocio pro negocio chamar o dao…
e eu chamo esse método no form e ñ no action…

private boolean gravarLibVeiculo(Tbl_Usuario u){
		try{
			synchronized (this) {
				Commav35 c35 = new Commav35();
				int dt = Integer.valueOf(dtCad.substring(6, 10)+dtCad.substring(3, 5)+dtCad.substring(0, 2));
				c35.setData(dt);
				c35.setUnidade(Integer.valueOf(u.getUnidade()));
				c35.setDescricao(descricao);
				Date dt1 = new Date();
				
				String hr = formataHora.format(dt1);
				if((hr.substring(1,2)).equals(":")){
					hr = "0"+hr;
				}
				
				c35.setHora(hr);
				c35.setJustificativa(justificativa.trim());
				if(pernoite == null){ //ñ é pernoite
					c35.setPernoite("N");
					c35.setAutorizada("S");//Aprovada
				}
				else{
					c35.setPernoite("S");
					c35.setAutorizada("N");//Não Aprovada
				}
				String mot[] = motorista.split(" - ");
				c35.setMotorista(mot[0]);
				String veic[] = veiculo.split(" - ");
				c35.setPlaca(veic[1]);
				c35.setRespMov(u.getMatricula());
				LibVeiculoNegocio lvn = new LibVeiculoNegocio();
				if(!lvn.verificaLiberacaoVeiculoEmAberto(c35.getPlaca())){ //ñ existe liberação da placa x em Aberto
					lvn.gravarLibVeiculo(c35);
					return true;
				}else//existe liberação do veículo em aberto
					return true; //usuário clicou duas vezes no btn de gravarliberação no mesmo momento
			}			
		}catch(Exception e){
			log.error("LibVeiculoForm gravarLibVeiculo getMessage: "+e.getMessage());
			return false;
		}
		
	}

e o método do dao que faz a inserção é…

public boolean gravarLibVeiculo(Commav35 c35) throws Exception{
		synchronized (this) {
			Connection conn = null;
			PreparedStatement p = null;
			try{
				StringBuffer sql = new StringBuffer();
				sql.append("INSERT INTO BASREBIC.COMMAV35 (CODIGO, PLACA, MOTORISTA, JUSTIFICATIVA, ");
				sql.append("DESCRICAO, DATA, HORA, RESPMOV, UNIDADE, STATUSLIB, PERNOITE, AUTORIZADA) VALUES ( ");
				sql.append("(SELECT (NEXT VALUE FOR BASREBIC.COMMAV35_SEQ) VALOR FROM SYSIBM.SYSDUMMY1), ");
				sql.append("?, ?, (SELECT C36.CODIGO FROM BASREBIC.COMMAV36 C36 WHERE C36.MOTIVO = ? ), ");
				sql.append("?, ?, ?, ?, ?, 'A', ?, ?)");
				Db2400Connection con = new Db2400Connection();
				conn = con.getConnection();
				conn.setAutoCommit(false);
				p = conn.prepareStatement(sql.toString());
				p.setString(1, c35.getPlaca());
				p.setString(2, c35.getMotorista());
				p.setString(3, c35.getJustificativa());
				p.setString(4, c35.getDescricao());
				p.setInt(5, c35.getData());
				p.setString(6, c35.getHora());
				p.setString(7, c35.getRespMov());
				p.setInt(8, c35.getUnidade());
				p.setString(9, c35.getPernoite());
				p.setString(10, c35.getAutorizada());
				if(!verificaLiberacaoVeiculoEmAberto(c35.getPlaca())){//ñ existe liberação da placa x em Aberto
					p.execute();
					conn.commit();
					return true;
				}
				else{//existe liberação da placa x em aberto, seja possível q foi gerado dois submit para repetir a gravação 
					return false;
				}
			}
			catch(Exception e){
				log.info("DB2400LibVeiculoDAO gravarLibVeiculo getMessage(): "+e.getMessage());
				conn.rollback();
				return false;
			}finally {
				if(p != null)p.close();
				if(conn != null)conn.close();
			}
		}		
	}
Criado 2 de julho de 2007
Ultima resposta 2 de jul. de 2007
Respostas 5
Participantes 3