If the application is multithreaded, you are potentially going to say that 10 threads are running at the same time. Each of them needs its own connection, but if you limit the pool size to 5, then you, the 6th thread, cannot get the connection from the pool.
You may be limiting your flows in some way, but I would suggest that you significantly increase the size of your application pool to make sure that you have more connections available than you can have threads. As an indicator, the default size (which is usually good enough for most people) is 100.
Also, if you have any recursion inside your using block (e.g. calling populate again), as you pointed out in the comments, unlike the code above, you will run into additional problems.
If you call populate inside the use block, then you will have the connection from the parent open and usable (therefore it cannot be reused), and then the child call will open another connection. If this happens just a few times, you will not have a dedicated connection.
To prevent this, you want to move the secondary call to populate from the use block. The easiest way is not to iterate over your recordset to fill in each identifier, to add identifiers to the list, and then after you have closed your connection and then filled in all new identifiers.
Alternatively, you can lazily evaluate things like address. They stored the addressID in a private field, and then made the address "Property", which checks if its support field (and not the address identifier) โโis filled, and if not, it looks through it with the AddressID. This has the advantage that if you never look at the address, you do not even make a database call. Depending on the use of the data, this can save you a lot of hits on the databases, but if you definitely use all the details, then they just change them, potentially spreading them a little more, which can help in performance or maybe just doesn't make any difference at all,:)
In general, with access to the database, I try to simply extract all the data and close the connection as soon as I can, preferably before deleting any complex calculations on the data. Another good reason is that depending on your query to the database, etc. You can potentially hold locks on tables that you access with your queries, which can cause lock problems on the database side.