По умолчанию для соединений с базой данных .NET используется пул . Вызов Close()
и Dispose()
просто освобождает соединение обратно в пул, но фактически не заставляет его закрываться. В конце концов, он выйдет из пула и фактически закроется.
После небольшого исследования, кажется, есть два основных способа предсказуемо приблизить его:
- Отключить пул в строке подключения - попробуйте добавить
OLE DB Services = -2;
, который должен предоставить вам все услуги, кроме пула
- Попробуйте использовать
OleDBConnection.ReleaseObjectPool()
Для последнего подхода вам может понадобиться поиграть с таймаутами - выдержка из связанной статьи MSDN:
Обратите внимание, что один только вызов метода фактически не освобождает активные соединения, существующие в пуле.
Перед окончательным удалением пула должно произойти следующее:
- Вызовите Close, чтобы вернуть объект подключения в пул.
- Разрешить каждому объекту соединения время вне пула.
- Вызов ReleaseObjectPool.
- Запустить сборку мусора.
У меня есть вариант использования для этого на работе, когда некоторые собственные программы должны взаимодействовать с частью старого, негибкого, нестабильного и абсолютно критического проприетарного программного обеспечения. Необходимо как можно быстрее открыть общий файл базы данных MDB, чтобы свести к минимуму окно, в котором другое программное обеспечение может «возникнуть» (очень плохо).
Я планирую использовать подход с использованием строки подключения, поскольку кажется, что гарантировать закрытие проще, и мое программное обеспечение на самом деле не получает выгоды от пула.