John,
thanks for your feedback. While implementing connection pooling would make resources utilization more efficient, I don't think it's the root of my problem. Most of the connected clients are at IDLE. When I do
select * from pg_stat_activity where current_query not like '%IDLE%';
I only see several active queries at any given time.