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 > -- > >
