Как найти незамкнутую связь? Тайм-аут истек. Время ожидания истекло до завершения операции или сервер не отвечает - PullRequest
3 голосов
/ 05 декабря 2008

У меня раньше была эта проблема, и я обнаружил, что в основном у меня есть соединение, которое я не закрываю достаточно быстро (оставление соединений открытым и ожидание сбора мусора на самом деле не лучшая практика).

Теперь я получаю это снова, но я не могу найти, где я оставляю свои связи открытыми. К тому времени, когда я вижу ошибку, база данных очистила старые соединения, поэтому я не вижу все заблокированные соединения последней командой (очень полезно в прошлый раз, когда у меня возникла эта проблема).

Есть идеи, как я мог бы использовать свой код или базу данных для отслеживания происходящего, чтобы я мог найти свой оскорбительный фрагмент кода?

Ответы [ 2 ]

1 голос
/ 05 декабря 2008

Ошибка, которую вы указываете, не указывает на то, что соединение оставлено открытым; более вероятно, что есть запрос, который занимает больше времени, чем ожидает приложение. Вы можете увеличить время ожидания ответа и использовать Sql, чтобы определить, какие запросы являются наиболее обременительными.

0 голосов
/ 05 декабря 2008

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

Я бы также начал задумываться о перепроектировании уровня доступа к данным путем реализации шаблона Disposable и, возможно, возврата POCO вместо объектов Data (... Tables, ... Sets, ... Readers).

...