Не потрібно ніяких сінглтонів. Зв'язок з базою йде через об'єкт DbConnection, який ви створюєте явно, передаючи connection string як параметр для конструктора, або він десь захований в "недрах" того фреймворку, через який ви працюєте з базою даних.
Фішка в тому, що "використані" об'єкти Connection не йдуть відразу на утилізацію гарбідж колектором, а автоматично поміщаються у спеціальний пул й живуть там деякий час. А при створенні нового Connection не створюється відразу нове з'єднання, а йде спроба використати готове з пулу, і вже якщо там нічого немає, то робиться нове. Так що .Net сам непогано визначає скільки відкритих з'єднань потрібно в програмі