[RESOLVIDO] Banco travando depois de Exception:Hibernate

4 respostas
R

Pessoal,

Quando executa minha aplicação e forço uma exception do hibernate o mesmo gera a exception normalmente porém a tabela que está sendo persistida trava voltando ao normal somente depois que fecho a aplicação. SQL2000: Timeout Expired.

Estou simulando a inserção de um valor já existente no banco:

public Usuario inserirUsuario(String nmUsuario, String dsLogin, String perfil, String email) throws Exception{
		

		try{
			this.session = HibernateUtil.getSessionFactory().openSession();
		
			this.tx = this.session.beginTransaction();
							
			Usuario user = new Usuario();
			
			user.setNmUsuario(nmUsuario);
			user.setDsLogin(dsLogin);
			user.setPerfil(perfil);
			user.setEmail(email);
			
		                  session.save(user);
			session.getTransaction().commit();					
		
			return user;
			
			
		}catch (Exception e) {
			
			e.printStackTrace();
			
			throw new Exception();
			
		}
	}

Exception Hibernate:

5:49:53.370  WARN   org.hibernate.util.JDBCExceptionReporter  - SQL Error: 2601, SQLState: 23000

15:49:53.370  ERROR  org.hibernate.util.JDBCExceptionReporter  - Cannot insert duplicate key row in object usuario with unique index idx_ds_login.

org.hibernate.exception.ConstraintViolationException: could not insert: [com.fozci.sicorc.model.Usuario]

at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)

at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)

at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2186)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2666)

at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)

at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)

at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)

at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)

at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)

at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)

at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)

at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)

at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:562)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:550)

at org.hibernate.impl.SessionImpl.save(SessionImpl.java:546)

at com.fozci.sicorc.persistence.UsuarioDAO.inserirUsuario(UsuarioDAO.java:164)

at com.fozci.sicorc.service.UsuarioService.inserirUsuario(UsuarioService.java:140)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at flex.messaging.services.remoting.adapters.JavaAdapter.invoke(JavaAdapter.java:421)

at flex.messaging.services.RemotingService.serviceMessage(RemotingService.java:183)

at flex.messaging.MessageBroker.routeMessageToService(MessageBroker.java:1495)

at flex.messaging.endpoints.AbstractEndpoint.serviceMessage(AbstractEndpoint.java:882)

at flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(MessageBrokerFilter.java:121)

at flex.messaging.endpoints.amf.LegacyFilter.invoke(LegacyFilter.java:158)

at flex.messaging.endpoints.amf.SessionFilter.invoke(SessionFilter.java:44)

at flex.messaging.endpoints.amf.BatchProcessFilter.invoke(BatchProcessFilter.java:67)

at flex.messaging.endpoints.amf.SerializationFilter.invoke(SerializationFilter.java:146)

at flex.messaging.endpoints.BaseHTTPEndpoint.service(BaseHTTPEndpoint.java:278)

at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:315)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

at java.lang.Thread.run(Unknown Source)

Caused by: java.sql.SQLException: Cannot insert duplicate key row in object usuario with unique index idx_ds_login.

 45 more

4 Respostas

leoramos

Mestre,
coloca um bloco finally fechando tua sessão:

Abraço!

R

Adicionei o seguinte bloco no final do DAO:

HibernateUtil.closeSession(); //Parece não ser um método válido

return user;			

			
		}catch (Exception e) {
			
			e.printStackTrace();
			
			throw new Exception();		
		}finally{
			
			this.session.close();
		}
	}

Esse método:

HibernateUtil.closeSession(); //Parece não ser um método válido

Ainda sim não funcionou!
É automatico quando dou um stop no servidor a tabela volta a responder. Muito Estranho!

leoramos

Cara, to meio que chutando onde anda teu closeSession.
Mas o que tá rolando aí é um lock, nada mais do que isso.
E outra, no teu catch, não esqueça de fazer o rollback da transação.
Abraço!

R

Coloquei o tx.rollback(); conforme você disse e funcionou! Vlw…

Obrigado!

Criado 14 de junho de 2011
Ultima resposta 14 de jun. de 2011
Respostas 4
Participantes 2