tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jean-Claude Haw-King-Chon <JChaw-king-c...@medifirst.fr>
Subject Re: Tomcat7 - ajax and connection pool : "connection closed" despite the use of "validationQuery" and "testOnBorrow"
Date Fri, 05 Apr 2013 15:37:44 GMT
Le 05/04/2013 13:09, Konstantin Kolinko a écrit :
> 2013/4/5 Jean-Claude Haw-King-Chon <JChaw-king-chon@medifirst.fr>:
>> Hi,
>>
>> I use the connection pool of tomcat7 and set a connection in a ThreadLocal.
>> The context is a web application : the threadLocal is configured when the
>> http request is initialized. The jdbc connection is closed and removed from
>> the threadLocal when the resquest is destroyed.
>>
> 1. What exactly do you mean by "initialized" and "destroyed"?
>
>> If I'm not mistaken, each http request is treated by one thread by tomcat.
>> So, I have one jdbc connection for each request ( = thread).
> 2. No.  It depends on how you use it and at what points in time you look at it.
>
> If you look at it in a call chain, e.g. using try{ } finally block in
> a Filter, then yes, all calls inside of "try" belong to the same
> thread.
>
> If you return processing to Tomcat and Tomcat makes a different call
> into your code (e.g. using Async or Comet APIs), then that call can be
> using a different thread from a thread pool.
>
>> (...)
>>
>> My problem appears when I use Ajax. For 2 successive ajax request, I have
>> the error "Connection closed" : it's a random problem (the stacktrace is not
>> the same for the 2 attemps and it's not depending of the thread execution
>> order).
>>
>> I know this issue :
>> http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html#Random_Connection_Closed_Exceptions
>>
>> "These can occur when one request gets a db connection from the connection
>> pool and closes it twice. When using a connection pool, closing the
>> connection just returns it to the pool for reuse by another request, it
>> doesn't close the connection. And Tomcat uses multiple threads to handle
>> concurrent requests"
>>
>> But, I'm sure, I always close the connection only once.
>> I use too the "validationQuery" and "testOnBorrow" parameters.
>>
>> Is it possible that the connection pool returns the same connection for 2
>> different threads?
>>
> You can check its hash code.
>
>> So I don't understand why my connection is closed during the treatment.
>>
> Best regards,
> Konstantin Kolinko
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>

1. What exactly do you mean by "initialized" and "destroyed"?

Sorry, to be more precise, 2 approches has been tested :

1) The connection is initialized in the servlet by a method called by 
"doGet" or "doPost".
But the connection is closed (and removed from the threadLocal) by a 
ServletRequestListener in the override of the "requestDestroyed" method.

2) The connection is initialized in the servlet by a method called by 
"doGet" or "doPost". The process is encapsuled in a try/catch/finally block.
The connection is closed (and removed from the threadLocal) in the 
finally block.

These 2 approches didn't work (random closed connection).



2. No.  It depends on how you use it and at what points in time you look at it.

So for the 2 approches, I'm in a call chain.


Is it possible that the connection pool returns the same connection for 2
different threads?
You can check its hash code.

Thank you for this tip. The thread name and the connection hashCode are 
now logged : I'm trying to understand the mechanism.
The first results show that the problem appears with connections 
precedently closed...

My configuration :

<Resource
         name="jdbc/607"
         auth="Container"
         type="javax.sql.DataSource"
         username="xxxxx"
         password="xxxxx"
         driverClassName="com.mysql.jdbc.Driver"
         url="jdbc:mysql://localhost:3306/XXXXX"
         removeAbandoned="true"
         removeAbandonedTimeout="300"
         testOnBorrow="true"
         validationQuery="SELECT 1"
         logAbandoned="true"
/>
Tomcat 7.0.29
Linux Fedora Core 12



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Mime
View raw message