Measure waiting and connection use
Compare active, idle, and waiting connection counts with request volume and latency over the same period. Break the view down by application instance or workload if possible to find whether one caller is holding connections unusually long.
Inspect query duration and transaction boundaries. A transaction that includes network calls or unrelated processing can hold a connection far beyond the database work itself; ensure code paths release connections on success, error, and cancellation.
Change capacity carefully
After identifying the bottleneck, tune the pool and database limits together using observed concurrency and the database’s safe operating range. Recheck memory, CPU, query latency, and queueing under representative load.
Add alerts for sustained waits and connection exhaustion, and document a response path. If saturation follows a deployment or traffic change, compare behavior with the previous version before raising limits.