Надеюсь, у вас есть один класс слоя доступа к данным, а не целая куча классов, каждый из которых создает свое собственное соединение, верно? Какой язык вы используете? Если вы используете C #, основной причиной этой проблемы является DataReaders и возврат этих объектов на верхние уровни. Скорее всего, некоторый клиентский класс не закрывает DataReader, который он получил от вашего класса DAL, оставляя соединение открытым / заблокированным для тех, кто знает, как долго. Отследите читатели, которые вы возвращаете, и убедитесь, что ваши клиентские классы закрывают / удаляют их правильно.
Я бы также начал задумываться о перепроектировании уровня доступа к данным путем реализации шаблона Disposable и, возможно, возврата POCO вместо объектов Data (... Tables, ... Sets, ... Readers).