Notes from https://discussion.heroku.com/t/using-puma-on-heroku/150/11?u=ckobayashi
(Number of Puma workers per dyno * * max number of threads per worker * number of dynos) + headroom = number of required connections.
So in your case: 7 * 16(?) * 4(?) = 448 db connections
The max of 16 threads per worker is Puma's default and can be overridden to something more inline with your needs. In reality, you probably won't need all 448 connections since it's unlikely, but not impossible, that all threads will grab a connection from the pool at the same time.
To see what your actual connection usage is like, I would suggest taking a look at the Postgres metrics in your log stream to see how many connections are open at any one time (this is only available on production tier dbs):