I would look at a couple of things.
Try identify if you have SQL calls taking longer than your connection wait timeout. If you have 50 connections all executing SQL and each piece of SQL takes 3 minutes to execute you could get this problem.
If its not the database then it could be a call to an integration point thats wrapped in the same transactional call as the db call.
Note: start and end transaction probably handled by Spring AOP
if the call to call http_service blocks waiting on a response , the connection that is used to make the SQL call will not be released to the connection pool until the whole method ends.
Maybe the external system you call experiences problems at your peak load and its not in the database.
You fix this by removing the remote call from the transaction
Perform a thread dump and see whats executing and what else is waiting[and look at code].