I donโt think you will have performance differences if you use singleton or not, because you can still have multiple threads working on the same method at the same time. If you take care not to have internal fields that will be used in all threads, everything will work well.
At the end, the class that manages the connection pool must be thread safe, and you end up with a few locks that can affect performance, but they are all needed. (he did internally within the framework, and you cannot change his behavior in any way)
If you decide not to use singleton, make sure that your DALs are lightweigth, because it may matter, but usually it is not.
Note. Speaking of connection pools, the only thing you need to take care of is to follow the โopen late, close earlyโ pattern. This means that delay the opening of the connection as much as possible and close it as soon as possible, having completed all that you need.
After the whole system is built using this magic rule, you can play with the parameters of the connection string to change some parameters of the pool (initial size, maximum size, ...)
source share