HI Graham,

I don't use org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory

but attribute logAbandoned="true"

 should log stacktrace of the place which allocated the connection into
catalina.out (in linux, windows may use different log file in logs
directory or standard output, depends on configuration).
This stacktrace leads to your code where you have to fix the connection
leak. The message is warning not an error and part of the message is this:

Connection has been abandoned PooledConnection


I use this Tomcat built in jdbc
pool factory="org.apache.tomcat.jdbc.pool.DataSourceFactory". I would
suggest switching to the Tomcat JDBC pool if you really don't see any
stacktrace with abandoned connections. More documentation is here
https://tomcat.apache.org/tomcat-9.0-doc/jndi-datasource-examples-howto.html

The leaked connection detection works this way:
1. request is sent to Tomcat web application and  db connection is
allocated (if needed)
2. connection is used
3. and should be returned

Tomcat knows which connections are allocated and after timeout it marks the
connection and stop using the db connection. Now is logged the warning
connection has been abandoned. There is no way to get breakpoint to the
place where the connection is leaked and you don't need it. Use the
stacktrace after message Connection has been abandoned, there is the place
you need to fix leaking.

Regards,
Zdenek





On Sun, Nov 16, 2025 at 10:54 AM Graham Leggett <[email protected]>
wrote:

> Hi all,
>
> I have a tomcat9 web application that is leaking connections, and I need
> to detect where the leaks are occurring. This is surprisingly difficult.
>
> The leak is reproducible, and occurs in a controlled test environment, so
> the vast majority of advice out there about monitoring database connections
> isn't useful - I know there is a leak. The codebase is large, so the "look
> at the codebase" advice doesn't work.
>
> The exceptions I get tell me all about the straw that broke the camel's
> back, but none of that is useful - what I need to know at that point is
> what else is on the camel's back.
>
> Is there a mechanism that exists where you can trigger a dump of the stack
> traces of all database connections currently open and where they were
> opened? Remember - in my case this is a reproducible leak in a controlled
> test environment, so I don't have the problem of a live system or filtering
> out noise.
>
> This isn't working for me, I see no stack traces related to abandoned
> connections:
>
>     <Resource auth="Container" driverClassName="org.postgresql.Driver"
> factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
> logAbandoned="true" maxIdle="5" maxTotal="5" maxWaitMillis="10000" name=""
> password="" type="javax.sql.DataSource" url="" username=""
> removeAbandonedOnBorrow="true" removeAbandoned="true"
> removeAbandonedTimeout="10" />
>
> Is there a breakpoint I can stop the code at, or a signal I can send?
>
> Regards,
> Graham
> --
>
>

Reply via email to