wood burning stoves 2.0*
The moose likes JDBC and the fly likes Best way to track down connection leak Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Android Security Essentials Live Lessons this week in the Android forum!
JavaRanch » Java Forums » Databases » JDBC
Bookmark "Best way to track down connection leak" Watch "Best way to track down connection leak" New topic
Author

Best way to track down connection leak

Justin Carter
Greenhorn

Joined: Jan 13, 2010
Posts: 9
We recently upgraded our connection pool manager to the version that is provided in Tomcat 6 (DBCP). However, we are plagued with an issue where the connection pool reaches its maxActive limit and then fails to release those connections back to the pool. (We do have removeAbandoned="true" and the removeAbandonedTimeout="30"). Eventually all of our web pages stall, and we have to restart Tomcat. We tried setting a maxWait value, but instead of a loading stall we get a lot of "pool error Timeout" exceptions and broken web pages. This issue also occurred in our previous connection pool before DBCP, so it seems like a problem that occurs no matter which connection pool implementation we use. The problem happens randomly; once or twice every couple of days. We have periods where this isn't an issue for weeks, and then times when we have to restart Tomcat a few times in one day.

I'm at a loss on how to track this down. We have turned on the stacktrace logging and fixed every abandoned connection found, but the issue still remains. I have even adding custom logging that will print a stacktrace whenever the connection pool reaches a new maximum size, but I wasn't able to determine anything from that. I also occasionally dig through the access logs during these episodes, but it feels like trying to find a needle in a haystack; also, all the page hits seem to be to pages that handle their connections properly.

So my questions are:
1) Could this some sort of thread-lock issue?
2) Any recommendations for pinpointing the problem?
3) Should we switch to yet a different connection pool manager (new tomcat-jdbc, c3p0, etc.)?

Here is my JNDI config:

<Resource name="jdbc/..."
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:..."
username="..."
password="..."
maxActive="50"
maxIdle="30"
minIdle="15"
initialSize="15"
removeAbandoned="true"
removeAbandonedTimeout="30"
maxWait="-1"/>
MarK sujoKi
Greenhorn

Joined: Sep 11, 2012
Posts: 2
Please go through below page, it might help
http://commons.apache.org/dbcp/configuration.html

Summary:
If you have enabled "removeAbandoned" then it is possible that a connection is reclaimed by the pool because it is considered to be abandoned. This mechanism is triggered when (getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)

For example maxActive=20 and 18 active connections and 1 idle connection would trigger the "removeAbandoned". But only the active connections that aren't used for more then "removeAbandonedTimeout" seconds are removed, default (300 sec). Traversing a resultset doesn't count as being used.

@Justin,
Please let me know, if you had figured out what the problem was in your case and the solution you implemented, if any.

thanks in advance!
Wendy Gibbons
Bartender

Joined: Oct 21, 2008
Posts: 1107

I would go through your code checking you are closing all your statements and all of that stuff.

And ensure they are all done in finally blocks in case of exceptions. (as you were getting problems before this change)
 
 
subject: Best way to track down connection leak
 
Similar Threads
Optimal JDBC connection pooling configuration for tomcat server
database connection pooling (dbcp) - help required
DBCP connection pooling with multiple web-apps
Application hosted on Tomcat has datasource DBCP issues
DBCP issue - Timeout waiting for idle object