[RESOLVIDO] Banco travando depois de Exception:Hibernate

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

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

Abraço!

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!

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!

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

Obrigado!