Thread: [c3p0-users] Deadlock at BasicResourcePool.awaitAvailable
Status: Beta
Brought to you by:
swaldman
From: <cci...@gm...> - 2006-12-15 17:02:48
|
Hi, I'm developing a web application that have been suffering from a deadlock right in BasicResourcePool.awaitAvailable(long). It happens after a few database queries. Seems to be a problem similar to this: http://sourceforge.net/mailarchive/forum.php?thread_id=3D30967392&forum_id= =3D35722 I've both debugged and googled a lot, but got no help. The same problem happened with Apache Jakarta Commons DBCP, then I replaced it with c3p0. Perhaps the problem is not at c3p0, but I have to be sure of that before go check other places. It's worth to note that I'm closing all Hibernate sessions right after every database operation is done; hence, I guess it's closing connections correctly (I hope). Setting checkoutTimeout to, say, 5000, causes c3p0 to throw an exception after 5 seconds waiting to check a connection out. Setting unreturnedConnectionTimeout to 5, for example, and setting debugUnreturnedConnectionStackTraces to true, seems to avoid the deadlock (very strange, huh?). This is what I'm actually using to develop, run and debug the web app: - c3p0 0.9.1 pre11 - Hibernate 3.2 - HSQL 1.8.0.7 - Eclipse 3.2.1 - Tomcat 5.5.20 - Struts 2.0.1 - Spring 2.0 The deadlocked thread's stack trace (got from Eclipse): Thread [http-8080-Processor24] (Suspended)=09 =09Object.wait(long) line: not available [native method]=09 =09BasicResourcePool.awaitAvailable(long) line: 1279=09 =09BasicResourcePool.prelimCheckoutResource(long) line: 521=09 =09BasicResourcePool.checkoutResource(long) line: 441=09 =09C3P0PooledConnectionPool.checkoutPooledConnection() line: 486=09 =09ComboPooledDataSource(AbstractPoolBackedDataSource).getConnection() line= : 128=09 =09LocalDataSourceConnectionProvider.getConnection() line: 81=09 =09ConnectionManager.openConnection() line: 417=09 =09ConnectionManager.getConnection() line: 144=09 =09BatchingBatcher(AbstractBatcher).prepareQueryStatement(String, boolean, ScrollMode) line: 139 =09EntityLoader(Loader).prepareQueryStatement(QueryParameters, boolean, SessionImplementor) line: 1560 =09EntityLoader(Loader).doQuery(SessionImplementor, QueryParameters, boolean) line: 661 =09EntityLoader(Loader).doQueryAndInitializeNonLazyCollections(SessionImple= mentor, QueryParameters, boolean) line: 224 =09EntityLoader(Loader).loadEntity(SessionImplementor, Object, Type, Object, String, Serializable, EntityPersister) line: 1784 =09EntityLoader(AbstractEntityLoader).load(SessionImplementor, Object, Object, Serializable) line: 48 =09EntityLoader(AbstractEntityLoader).load(Serializable, Object, SessionImplementor) line: 42 =09SingleTableEntityPersister(AbstractEntityPersister).load(Serializable, Object, LockMode, SessionImplementor) line: 2977 =09DefaultLoadEventListener.loadFromDatasource(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 393 =09DefaultLoadEventListener.doLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 374 =09DefaultLoadEventListener.load(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 137 =09DefaultLoadEventListener.proxyOrLoad(LoadEvent, EntityPersister, EntityKey, LoadEventListener$LoadType) line: 193 =09DefaultLoadEventListener.onLoad(LoadEvent, LoadEventListener$LoadType) line: 101 =09SessionImpl.fireLoad(LoadEvent, LoadEventListener$LoadType) line: 878=09 =09SessionImpl.get(String, Serializable) line: 815=09 =09SessionImpl.get(Class, Serializable) line: 808=09 =09UserDao.get(int) line: 37=09 =09UserAction.load() line: 60=09 =09UserAction.input() line: 54=09 =09NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] =09NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39=09 =09DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25=09 =09Method.invoke(Object, Object...) line: 585=09 =09DefaultActionInvocation.invokeAction(Object, ActionConfig) line: 360=09 =09DefaultActionInvocation.invokeActionOnly() line: 228=09 =09DefaultActionInvocation.invoke() line: 202=09 =09AuthenticationInterceptor.intercept(ActionInvocation) line: 15=09 =09DefaultActionInvocation.invoke() line: 200=09 =09DefaultWorkflowInterceptor(MethodFilterInterceptor).intercept(ActionInvo= cation) line: 88 =09DefaultActionInvocation.invoke() line: 200=09 =09ValidationInterceptor(MethodFilterInterceptor).intercept(ActionInvocatio= n) line: 88 =09DefaultActionInvocation.invoke() line: 200=09 =09StrutsConversionErrorInterceptor(ConversionErrorInterceptor).intercept(A= ctionInvocation) line: 123 =09DefaultActionInvocation.invoke() line: 200=09 =09ParametersInterceptor.intercept(ActionInvocation) line: 147=09 =09DefaultActionInvocation.invoke() line: 200=09 =09StaticParametersInterceptor.intercept(ActionInvocation) line: 105=09 =09DefaultActionInvocation.invoke() line: 200=09 =09CheckboxInterceptor.intercept(ActionInvocation) line: 80=09 =09DefaultActionInvocation.invoke() line: 200=09 =09FileUploadInterceptor.intercept(ActionInvocation) line: 204=09 =09DefaultActionInvocation.invoke() line: 200=09 =09ModelDrivenInterceptor.intercept(ActionInvocation) line: 74=09 =09DefaultActionInvocation.invoke() line: 200=09 =09ScopedModelDrivenInterceptor.intercept(ActionInvocation) line: 120=09 =09DefaultActionInvocation.invoke() line: 200=09 =09ProfilingActivationInterceptor.intercept(ActionInvocation) line: 59=09 =09DefaultActionInvocation.invoke() line: 200=09 =09DebuggingInterceptor.intercept(ActionInvocation) line: 174=09 =09DefaultActionInvocation.invoke() line: 200=09 =09ChainingInterceptor.intercept(ActionInvocation) line: 115=09 =09DefaultActionInvocation.invoke() line: 200=09 =09I18nInterceptor.intercept(ActionInvocation) line: 143=09 =09DefaultActionInvocation.invoke() line: 200=09 =09PrepareInterceptor.intercept(ActionInvocation) line: 115=09 =09DefaultActionInvocation.invoke() line: 200=09 =09ServletConfigInterceptor.intercept(ActionInvocation) line: 156=09 =09DefaultActionInvocation.invoke() line: 200=09 =09AliasInterceptor.intercept(ActionInvocation) line: 124=09 =09DefaultActionInvocation.invoke() line: 200=09 =09ExceptionMappingInterceptor.intercept(ActionInvocation) line: 180=09 =09DefaultActionInvocation.invoke() line: 200=09 =09StrutsActionProxy$1.call() line: 27=09 =09StrutsActionProxy$1.call() line: 26=09 =09RequestContextImpl.callInContext(ActionInvocation, Callable<String>) lin= e: 152=09 =09StrutsActionProxy.execute() line: 25=09 =09Dispatcher.serviceAction(HttpServletRequest, HttpServletResponse, ServletContext, ActionMapping) line: 330 =09FilterDispatcher.doFilter(ServletRequest, ServletResponse, FilterChain) line: 256 =09ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 202 =09ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 1= 73=09 =09PageFilter.parsePage(HttpServletRequest, HttpServletResponse, FilterChain) line: 119 =09PageFilter.doFilter(ServletRequest, ServletResponse, FilterChain) line: = 55=09 =09ApplicationFilterChain.internalDoFilter(ServletRequest, ServletResponse) line: 202 =09ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 1= 73=09 =09StandardWrapperValve.invoke(Request, Response) line: 213=09 =09StandardContextValve.invoke(Request, Response) line: 178=09 =09StandardHostValve.invoke(Request, Response) line: 126=09 =09ErrorReportValve.invoke(Request, Response) line: 105=09 =09StandardEngineValve.invoke(Request, Response) line: 107=09 =09CoyoteAdapter.service(Request, Response) line: 148=09 =09Http11Processor.process(InputStream, OutputStream) line: 869=09 =09Http11Protocol$JmxHttp11ConnectionHandler(Http11BaseProtocol$Http11Conne= ctionHandler).processConnection(TcpConnection, Object[]) line: 664 =09PoolTcpEndpoint.processSocket(Socket, TcpConnection, Object[]) line: 527= =09 =09LeaderFollowerWorkerThread.runIt(Object[]) line: 80=09 =09ThreadPool$ControlRunnable.run() line: 684=09 =09ThreadWithAttributes(Thread).run() line: 595=09 Below, the Spring's beans configuration file. <beans ...> =09<bean id=3D"dataSource" =09=09class=3D"com.mchange.v2.c3p0.ComboPooledDataSource" =09=09destroy-method=3D"close"> =09=09<property name=3D"driverClass" value=3D"org.hsqldb.jdbcDriver" /> =09=09<property name=3D"jdbcUrl" value=3D"jdbc:hsqldb:hsql://localhost/sed"= /> =09=09<property name=3D"user" value=3D"sa" /> =09=09<property name=3D"password" value=3D"" /> =09</bean> =09<bean id=3D"sessionFactory" =09=09class=3D"org.springframework.orm.hibernate3.LocalSessionFactoryBean"> =09=09<property name=3D"dataSource" ref=3D"dataSource" /> =09=09<property name=3D"mappingResources"> =09=09=09<list> =09=09=09=09<value>mappings/User.hbm.xml</value> =09=09=09</list> =09=09</property> =09=09<property name=3D"hibernateProperties"> =09=09=09<props> =09=09=09=09<prop key=3D"hibernate.dialect">org.hibernate.dialect.HSQLDiale= ct</prop> =09=09=09=09<prop key=3D"hibernate.c3p0.max_size">10</prop> =09=09=09</props> =09=09</property> =09</bean> ... </beans> As the web app is in a very premature stage (it actually manages only the app's users records), I may send privately a zipped file containing the whole app. It should be just a matter of setting up both Eclipse and Tomcat to get the app up and running. I appreciate any help! C=E9lio. |
From: Steve W. <swa...@mc...> - 2006-12-16 09:05:18
|
C=E9lio, The stack trace you are showing is the stack trace that is expected =20 when a client is waiting for a Connection, but none is available. If =20 no checkoutTimeout is set, clients will wait indefinitely until a =20 Connection becomes available, either via checkin (from some other =20 client), or new acquisition (from the database), iff the number of =20 managed Connections is less than maxPoolSize. The fact that an unreturnedConnectionTimeout resolves the problem =20 (and that the problem appears under multiple Connection pools) =20 indicates that it is probably a Connection leak somewhere in your =20 code. When you set debugUnreturnedConnectionStackTraces, c3p0 should =20 have printed stack traces into your logs whenever it killed an =20 unreturned Connection. Pay attention to those stack traces -- they =20 tell you how the Connection that eventually leaked was originally =20 checked out. > It's worth to note that I'm closing all Hibernate sessions right after > every database operation is done; hence, I guess it's closing > connections correctly (I hope). This probably isn't good enough. If you have: Session mySession =3D ...; /however you initialize Sessions // do some hibernate work... mySession.close(); ...then every time an Exception occurs inside the hibernate work, the =20= close() is skipped. You MUST use Java's "reliable resource cleanup" =20 idiom if you want to avoid Connection leaks in a long-running server =20 process. That would be like this: Session mySession =3D null; try { mySession =3D ...; //however you initialize Sessions // do some hibernate work... } finally { try { if (mySession !=3D null) mySession.close(); } catch(Exception e) { log("Exception on close", e); } } Note that if you are working with more than one closable resource, =20 you must make a SEPARATE, BEST ATTEMPT to close each resource: Session mySession =3D null; InputStream is =3D null; try { mySession =3D ...; //however you initialize Sessions is =3D createControlFileInputStream(); // read from the input stream // do some hibernate work, based on control file... } finally { try { if (is !=3D null) is.close(); } catch(Exception e) { log("Exception on close", e); } try { if (mySession !=3D null) mySession.close(); } catch(Exception e) { log("Exception on close", e); } } Note that the closing of the two separate resources occurs in =20 distinct try/catch clocks (nested within the finally block). This is =20 important -- if you put them ion a single try/catch (or don't nest =20 any try/catch blocks), a failure to close() the first resource leads =20 to a failure to close() the second. By the way, none of this is c3p0-specific advice. It's widely =20 applicable good Java hygiene. Connection pool exhaustion is just one =20 of many ways a failure to close() resources property can manifest =20 itself. Good luck! Steve --- Steve Waldman Machinery For Change, Inc. On Dec 15, 2006, at 12:02 PM, C=E9lio Cidral Junior wrote: > Hi, > > I'm developing a web application that have been suffering from a > deadlock right in BasicResourcePool.awaitAvailable(long). It happens > after a few database queries. Seems to be a problem similar to this: > > http://sourceforge.net/mailarchive/forum.php?=20 > thread_id=3D30967392&forum_id=3D35722 > > I've both debugged and googled a lot, but got no help. The same > problem happened with Apache Jakarta Commons DBCP, then I replaced it > with c3p0. Perhaps the problem is not at c3p0, but I have to be sure > of that before go check other places. > > It's worth to note that I'm closing all Hibernate sessions right after > every database operation is done; hence, I guess it's closing > connections correctly (I hope). > > Setting checkoutTimeout to, say, 5000, causes c3p0 to throw an > exception after 5 seconds waiting to check a connection out. Setting > unreturnedConnectionTimeout to 5, for example, and setting > debugUnreturnedConnectionStackTraces to true, seems to avoid the > deadlock (very strange, huh?). > > This is what I'm actually using to develop, run and debug the web app: > > - c3p0 0.9.1 pre11 > - Hibernate 3.2 > - HSQL 1.8.0.7 > - Eclipse 3.2.1 > - Tomcat 5.5.20 > - Struts 2.0.1 > - Spring 2.0 > > The deadlocked thread's stack trace (got from Eclipse): > > Thread [http-8080-Processor24] (Suspended)=09 > Object.wait(long) line: not available [native method]=09 > BasicResourcePool.awaitAvailable(long) line: 1279=09 > BasicResourcePool.prelimCheckoutResource(long) line: 521=09 > BasicResourcePool.checkoutResource(long) line: 441=09 > C3P0PooledConnectionPool.checkoutPooledConnection() line: 486=09 > = ComboPooledDataSource(AbstractPoolBackedDataSource).getConnection=20 > () line: 128=09 > LocalDataSourceConnectionProvider.getConnection() line: 81=09 > ConnectionManager.openConnection() line: 417=09 > ConnectionManager.getConnection() line: 144=09 > BatchingBatcher(AbstractBatcher).prepareQueryStatement(String, > boolean, ScrollMode) line: 139 > EntityLoader(Loader).prepareQueryStatement(QueryParameters, = boolean, > SessionImplementor) line: 1560 > EntityLoader(Loader).doQuery(SessionImplementor, = QueryParameters, > boolean) line: 661 > EntityLoader(Loader).doQueryAndInitializeNonLazyCollections=20 > (SessionImplementor, > QueryParameters, boolean) line: 224 > EntityLoader(Loader).loadEntity(SessionImplementor, Object, = Type, > Object, String, Serializable, EntityPersister) line: 1784 > EntityLoader(AbstractEntityLoader).load(SessionImplementor, = Object, > Object, Serializable) line: 48 > EntityLoader(AbstractEntityLoader).load(Serializable, Object, > SessionImplementor) line: 42 > SingleTableEntityPersister(AbstractEntityPersister).load=20 > (Serializable, > Object, LockMode, SessionImplementor) line: 2977 > DefaultLoadEventListener.loadFromDatasource(LoadEvent, > EntityPersister, EntityKey, LoadEventListener$LoadType) line: 393 > DefaultLoadEventListener.doLoad(LoadEvent, EntityPersister, > EntityKey, LoadEventListener$LoadType) line: 374 > DefaultLoadEventListener.load(LoadEvent, EntityPersister, = EntityKey, > LoadEventListener$LoadType) line: 137 > DefaultLoadEventListener.proxyOrLoad(LoadEvent, EntityPersister, > EntityKey, LoadEventListener$LoadType) line: 193 > DefaultLoadEventListener.onLoad(LoadEvent, > LoadEventListener$LoadType) line: 101 > SessionImpl.fireLoad(LoadEvent, LoadEventListener$LoadType) = line: =20 > 878=09 > SessionImpl.get(String, Serializable) line: 815=09 > SessionImpl.get(Class, Serializable) line: 808=09 > UserDao.get(int) line: 37=09 > UserAction.load() line: 60=09 > UserAction.input() line: 54=09 > NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: = not > available [native method] > NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39=09 > DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25=09= > Method.invoke(Object, Object...) line: 585=09 > DefaultActionInvocation.invokeAction(Object, ActionConfig) line: = 360=09 > DefaultActionInvocation.invokeActionOnly() line: 228=09 > DefaultActionInvocation.invoke() line: 202=09 > AuthenticationInterceptor.intercept(ActionInvocation) line: 15=09= > DefaultActionInvocation.invoke() line: 200=09 > DefaultWorkflowInterceptor(MethodFilterInterceptor).intercept=20 > (ActionInvocation) > line: 88 > DefaultActionInvocation.invoke() line: 200=09 > ValidationInterceptor(MethodFilterInterceptor).intercept=20 > (ActionInvocation) > line: 88 > DefaultActionInvocation.invoke() line: 200=09 > StrutsConversionErrorInterceptor=20 > (ConversionErrorInterceptor).intercept(ActionInvocation) > line: 123 > DefaultActionInvocation.invoke() line: 200=09 > ParametersInterceptor.intercept(ActionInvocation) line: 147=09 > DefaultActionInvocation.invoke() line: 200=09 > StaticParametersInterceptor.intercept(ActionInvocation) line: = 105=09 > DefaultActionInvocation.invoke() line: 200=09 > CheckboxInterceptor.intercept(ActionInvocation) line: 80=09 > DefaultActionInvocation.invoke() line: 200=09 > FileUploadInterceptor.intercept(ActionInvocation) line: 204=09 > DefaultActionInvocation.invoke() line: 200=09 > ModelDrivenInterceptor.intercept(ActionInvocation) line: 74=09 > DefaultActionInvocation.invoke() line: 200=09 > ScopedModelDrivenInterceptor.intercept(ActionInvocation) line: = 120=09 > DefaultActionInvocation.invoke() line: 200=09 > ProfilingActivationInterceptor.intercept(ActionInvocation) line: = 59=09 > DefaultActionInvocation.invoke() line: 200=09 > DebuggingInterceptor.intercept(ActionInvocation) line: 174=09 > DefaultActionInvocation.invoke() line: 200=09 > ChainingInterceptor.intercept(ActionInvocation) line: 115=09 > DefaultActionInvocation.invoke() line: 200=09 > I18nInterceptor.intercept(ActionInvocation) line: 143=09 > DefaultActionInvocation.invoke() line: 200=09 > PrepareInterceptor.intercept(ActionInvocation) line: 115=09 > DefaultActionInvocation.invoke() line: 200=09 > ServletConfigInterceptor.intercept(ActionInvocation) line: 156=09= > DefaultActionInvocation.invoke() line: 200=09 > AliasInterceptor.intercept(ActionInvocation) line: 124=09 > DefaultActionInvocation.invoke() line: 200=09 > ExceptionMappingInterceptor.intercept(ActionInvocation) line: = 180=09 > DefaultActionInvocation.invoke() line: 200=09 > StrutsActionProxy$1.call() line: 27=09 > StrutsActionProxy$1.call() line: 26=09 > RequestContextImpl.callInContext(ActionInvocation, =20 > Callable<String>) line: 152=09 > StrutsActionProxy.execute() line: 25=09 > Dispatcher.serviceAction(HttpServletRequest, = HttpServletResponse, > ServletContext, ActionMapping) line: 330 > FilterDispatcher.doFilter(ServletRequest, ServletResponse, > FilterChain) line: 256 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 202 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) = =20 > line: 173=09 > PageFilter.parsePage(HttpServletRequest, HttpServletResponse, > FilterChain) line: 119 > PageFilter.doFilter(ServletRequest, ServletResponse, = FilterChain) =20 > line: 55=09 > ApplicationFilterChain.internalDoFilter(ServletRequest, > ServletResponse) line: 202 > ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) = =20 > line: 173=09 > StandardWrapperValve.invoke(Request, Response) line: 213=09 > StandardContextValve.invoke(Request, Response) line: 178=09 > StandardHostValve.invoke(Request, Response) line: 126=09 > ErrorReportValve.invoke(Request, Response) line: 105=09 > StandardEngineValve.invoke(Request, Response) line: 107=09 > CoyoteAdapter.service(Request, Response) line: 148=09 > Http11Processor.process(InputStream, OutputStream) line: 869=09 > Http11Protocol$JmxHttp11ConnectionHandler(Http11BaseProtocol=20 > $Http11ConnectionHandler).processConnection(TcpConnection, > Object[]) line: 664 > PoolTcpEndpoint.processSocket(Socket, TcpConnection, Object[]) =20= > line: 527=09 > LeaderFollowerWorkerThread.runIt(Object[]) line: 80=09 > ThreadPool$ControlRunnable.run() line: 684=09 > ThreadWithAttributes(Thread).run() line: 595=09 > > > Below, the Spring's beans configuration file. > > <beans ...> > <bean id=3D"dataSource" > class=3D"com.mchange.v2.c3p0.ComboPooledDataSource" > destroy-method=3D"close"> > <property name=3D"driverClass" = value=3D"org.hsqldb.jdbcDriver" /> > <property name=3D"jdbcUrl" = value=3D"jdbc:hsqldb:hsql://localhost/sed" /> > <property name=3D"user" value=3D"sa" /> > <property name=3D"password" value=3D"" /> > </bean> > > <bean id=3D"sessionFactory" > = class=3D"org.springframework.orm.hibernate3.LocalSessionFactoryBean"> > <property name=3D"dataSource" ref=3D"dataSource" /> > <property name=3D"mappingResources"> > <list> > <value>mappings/User.hbm.xml</value> > </list> > </property> > <property name=3D"hibernateProperties"> > <props> > <prop =20 > key=3D"hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> > <prop = key=3D"hibernate.c3p0.max_size">10</prop> > </props> > </property> > </bean> > ... > </beans> > > > As the web app is in a very premature stage (it actually manages only > the app's users records), I may send privately a zipped file > containing the whole app. It should be just a matter of setting up > both Eclipse and Tomcat to get the app up and running. > > I appreciate any help! > > C=E9lio. > > ----------------------------------------------------------------------=20= > --- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to =20 > share your > opinions on IT & business topics through brief surveys - and earn cash > http://www.techsay.com/default.php?=20 > page=3Djoin.php&p=3Dsourceforge&CID=3DDEVDEV > _______________________________________________ > c3p0-users mailing list > c3p...@li... > https://lists.sourceforge.net/lists/listinfo/c3p0-users |
From: <cci...@gm...> - 2006-12-18 16:16:31
|
2006/12/16, Steve Waldman <swa...@mc...>: > Pay attention to those stack traces -- they > tell you how the Connection that eventually leaked was originally > checked out. Thanks Steve! Those stack traces told me where exactly my fault was. I have four methods which execute some database operation; two of them were not closing the session (which means that I accidentally lied to you about closing all sessions). They were something like this: public List<User> list() { return getSession().createCriteria(User.class).list(); } Then I changed to this: public List<User> list() { List<User> list; Session session =3D getSession(); try { Transaction transaction =3D session.beginTransaction(); try { list =3D getSession().createCriteria(User.class).lis= t(); transaction.commit(); } catch (HibernateException exception) { transaction.rollback(); throw exception; } } finally { releaseSession(session); } return list } Problem solved! :-) No more deadlocks. Thanks for your patience! C=E9lio. |