26. September 2005

Preventing dB connection pool leaks

A database connection pool creates and manages a pool of connections to a database. Recycling and reusing already
existing connections to a dB is more efficient than opening a new connection.
There is one problem with connection pooling. A web application has to explicetely close ResultSet's, Statement's,
and Connection's. Failure of a web application to close these resources can result in them never being available
again for reuse, a db connection pool "leak". This can eventually result in your web application db connections
failing if there are no more available connections.
There is a solution to this problem. The Jakarta-Commons DBCP can be configured to track and recover these
abandoned dB connections. Not only can it recover them, but also generate a stack trace for the code which opened
these resources and never closed them.
To configure a DBCP DataSource so that abandoned dB connections are removed and recycled add the following
paramater to the ResourceParams configuration for your DBCP DataSource Resource:
<parameter>
<name>removeAbandoned</name>
<value>>true</value>
</parameter>
When available db connections run low DBCP will recover and recyle any abandoned dB connections it finds. The
default is false.
Use the removeAbandonedTimeout parameter to set the number of seconds a dB connection has been idle before it
is considered abandoned.
<parameter>
<name>removeAbandonedTimeou</name>
<value>60</value>
</parameter>
The default timeout for removing abandoned connections is 300 seconds.
The logAbandoned parameter can be set to true if you want DBCP to log a stack trace of the code which
abandoned the dB connection resources.
<parameter>
<name>logAbandoned</name>
<value>true</value>
<</parameter>
The default is false.