tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ramzi khlil <ramzi.atv...@gmail.com>
Subject Re: ConnectionPool question
Date Wed, 04 Nov 2009 14:50:33 GMT
Yes, It releases the connection back to the pool.



On Wed, Nov 4, 2009 at 9:43 AM, Carsten Pohl <pohl@tyntec.com> wrote:

> Hi,
>
> if you close the connection, it will be recycled. So, close() does not
> really close, but releases the connection.
>
> Regards,
> Carsten Pohl
>  ----- Original Message -----
> From: "Josh Gooding" <josh.gooding@gmail.com>
> To: "Tomcat Users List" <users@tomcat.apache.org>
> Sent: Wednesday, 4 November, 2009 14:56:20 GMT +01:00 Amsterdam / Berlin /
> Bern / Rome / Stockholm / Vienna
> Subject: Re: ConnectionPool question
>
> HOLY MOLY I am getting a TON of abandoned connection warnings now.....  I
> see I have logAbandoned="true".  My Catalina log grew fast!  Now here is a
> question, everytime I recycle a connection (close RS, statement, and the
> connection) does it place it back into the pool or is that what the
> abandoned connection messages are for letting me know they were abandoned
> and put back into the pool?
>
> On Tue, Nov 3, 2009 at 4:06 PM, Josh Gooding <josh.gooding@gmail.com>
> wrote:
>
> > nevermind.  I get:
> >
> > javax.servlet.ServletException:
> com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
> >
> >
> > No operations allowed after connection closed.
> >
> > Guess that answers my question.
> >
> >
> > On Tue, Nov 3, 2009 at 3:24 PM, Josh Gooding <josh.gooding@gmail.com
> >wrote:
> >
> >> If I close the RS, can I still use the MD?
> >>
> >>
> >> On Tue, Nov 3, 2009 at 3:13 PM, Elli Albek <elli@sustainlane.com>
> wrote:
> >>
> >>> No, you do not need to close the XXXMetaData classes.
> >>>
> >>> E
> >>>
> >>> On Tue, Nov 3, 2009 at 12:02 PM, Josh Gooding <josh.gooding@gmail.com
> >>> >wrote:
> >>>
> >>> > One more question on bleeding resources.  When closing RS / statement
> /
> >>> > connections.  Do I have to do anything with the MetaData if I got
> that
> >>> as
> >>> > well?  (I.E Do I explicitly have to close the metadata as well?)
> >>> >
> >>> > Josh
> >>> >
> >>> > On Tue, Nov 3, 2009 at 2:01 PM, Josh Gooding <josh.gooding@gmail.com
> >
> >>> > wrote:
> >>> >
> >>> > > Elle,
> >>> > >
> >>> > > I am going to dig into this code and check it out.  I want to
know
> >>> more
> >>> > > about how to use threadlocal and filters.  (Sorry I'm not as
> >>> experienced
> >>> > in
> >>> > > Tomcat as some for you gurus here).
> >>> > >
> >>> > > The code looks promising and I like the 2nd option due to the
fact
> >>> that
> >>> > > each HTTP req. only has one connection (which should drop the
> >>> overhead
> >>> > > immensely) however for right now, I just want to fix the bleeding
> >>> issue
> >>> > > (which it seems that I have caught a good portion of them), so
I'll
> >>> use
> >>> > my
> >>> > > legacy code, but during a "minor" code release, I can definitely
> look
> >>> > into
> >>> > > rolling this out.  I am getting a ton of "abandoned" connection
> >>> warnings
> >>> > in
> >>> > > the console window, so I need to find out where these are coming
> from
> >>> > now.
> >>> > >
> >>> > > I don't know where to begin thanking you guys but thank you. 
I've
> >>> gotten
> >>> > > more mentoring here on this listing than I have in 2 years at
my
> >>> current
> >>> > > employer.  Thank you all again.
> >>> > >
> >>> > > - Josh
> >>> > >
> >>> > >
> >>> > > On Mon, Nov 2, 2009 at 3:40 PM, Christopher Schultz <
> >>> > > chris@christopherschultz.net> wrote:
> >>> > >
> >>> > >> -----BEGIN PGP SIGNED MESSAGE-----
> >>> > >> Hash: SHA1
> >>> > >>
> >>> > >> Elli,
> >>> > >>
> >>> > >> On 11/2/2009 4:08 AM, Elli Albek wrote:
> >>> > >> > I think you can have a solution without changing your
code.
> >>> > >> >
> >>> > >> > Try something like this:
> >>> > >> >
> >>> > >> > getConnection() static method should get the connection,
and add
> >>> it to
> >>> > a
> >>> > >> > list that you keep in threadlocal.
> >>> > >> >
> >>> > >> > recycleConnection() should close the connection and remove
the
> >>> > >> connection
> >>> > >> > object from thread local.
> >>> > >> >
> >>> > >> > Add a servlet filter that closes all connections in thread
> local.
> >>> The
> >>> > >> filter
> >>> > >> > calls next filter, and in a finally block get the connections
> from
> >>> > >> thread
> >>> > >> > local, close all of them, and clear the list in thread
local.
> >>> > >>
> >>> > >> This is a horrible, nasty hack and it's entirely brilliant!
> >>> > >>
> >>> > >> I would change Elli's implementation just slightly, and actually
> >>> write
> >>> > >> your own DataSource implementation that piggybacks on another
one.
> >>> > >> Basically, you just wrap the DataSource that Tomcat provides
> either
> >>> by:
> >>> > >>
> >>> > >> a. Using JNDI to look-up the Tomcat-created JNDI DataSource
and
> just
> >>> > >>   writing the plumbing code to pass everything through
> >>> > >> b. Actually subclass the DataSource class(es) provided by
Tomcat
> and
> >>> > >>   use /those/ in your <Resource> configuration.
> >>> > >>
> >>> > >> I would also not make any of this static... there's just no
reason
> >>> to do
> >>> > >> so, especially if your DataSource object is in the JNDI context.
> >>> > >>
> >>> > >> Although the /real/ solution is to fix the code, I really
like
> this
> >>> > >> solution for a couple of reasons:
> >>> > >>
> >>> > >> 1. It requires no wrapping of Connection, Statement, etc.
objects
> >>> > >>   (which is entirely miserable if you've ever had to do it)
> >>> > >> 2. It requires no changes to your code whatsoever (if you
use my
> >>> > >>   DataSource-wrapping suggestion above)
> >>> > >> 3. You won't end up closing your connection, statement, result
> set,
> >>> etc.
> >>> > >>   too early because your code has completed execution (unless
you
> >>> > >>   are using JDBC resources across requests, which is another
> story)
> >>> > >>
> >>> > >> What this won't help, unfortunately is:
> >>> > >>
> >>> > >> * Closing your ResultSet and Statement objects (though this
can be
> >>> > >>  solved by wrapping the Connection, Statement, etc. objects
> handed-
> >>> > >>  out by your DataSource. Yes, it's miserable.)
> >>> > >>
> >>> > >> > This will allow you to keep your legacy code. As far
as I
> remember
> >>> > DBCP
> >>> > >> has
> >>> > >> > an option to close the result sets and statements when
you close
> >>> the
> >>> > >> > connection. If not this will partly work.
> >>> > >>
> >>> > >> I don't believe commons-dbcp has this capability at all. I'm
> willing
> >>> to
> >>> > >> read any documentation to the contrary, though.
> >>> > >>
> >>> > >> > Version 2: Advanced
> >>> > >> >
> >>> > >> > Keep the actual connection in thread local. You will
have one
> >>> > connection
> >>> > >> per
> >>> > >> > HTTP request. getConnection() should be something like
> >>> > >> >
> >>> > >> > public static /* NOT synchronized */ Connection getConnection(){
> >>> > >> >
> >>> > >> > Connection c = ...// get the connection from thread local
> >>> > >> >
> >>> > >> > if (c != null)
> >>> > >> >
> >>> > >> > return c;
> >>> > >> >
> >>> > >> > Connection c = ...// get the connection from JNDI/DBCP
> >>> > >> >
> >>> > >> > // put connection in thread local
> >>> > >> >
> >>> > >> > return c;
> >>> > >> >
> >>> > >> > }
> >>> > >>
> >>> > >> I like this technique, too. You just have to decide if it's
> >>> acceptable
> >>> > >> for your webapp to re-use connections. I can't imagine why
that
> >>> would be
> >>> > >> a problem, but it's worth considering before you blindly do
it.
> This
> >>> > >> optimization can save you from deadlock (though you're killing-off
> >>> > >> connections after 15 seconds anyway) and should significantly
> >>> improve
> >>> > >> the performance of your webapp because you won't be bleeding
so
> many
> >>> > >> connections: you're limited to bleeding one connection per
request
> >>> > >> instead of potentially dozens.
> >>> > >>
> >>> > >> > recycleConnection(){
> >>> > >> >
> >>> > >> > // empty, connection will be recycled by filter.
> >>> > >> >
> >>> > >> > }
> >>> > >>
> >>> > >> I would actually allow recycleConnection to close the connection,
> >>> and
> >>> > >> have the filter call recycleConnection. That way, as you improve
> >>> your
> >>> > >> webapp's code, the connections will be closed as soon as possible
> >>> > >> instead of waiting until the request is (mostly) finished.
> >>> > >>
> >>> > >> Again, Elli, a great suggestion!
> >>> > >>
> >>> > >> - -chris
> >>> > >> -----BEGIN PGP SIGNATURE-----
> >>> > >> Version: GnuPG v1.4.10 (MingW32)
> >>> > >> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
> >>> > >>
> >>> > >> iEYEARECAAYFAkrvQ8AACgkQ9CaO5/Lv0PDOSACeJfqgaXmrySSKItQHji2K6UzK
> >>> > >> hmsAoKIAhRAgwzI/QN8SPdVGkBbewA2a
> >>> > >> =Mqjn
> >>> > >> -----END PGP SIGNATURE-----
> >>> > >>
> >>> > >>
> >>> ---------------------------------------------------------------------
> >>> > >> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> >>> > >> For additional commands, e-mail: users-help@tomcat.apache.org
> >>> > >>
> >>> > >>
> >>> > >
> >>> >
> >>>
> >>
> >>
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message