Суть такова: нужно написать программку, которая работает с базой (MS SQL), при необходимости (когда захочет пользователь) восстанавливает её из резервной копии, а также эти резервные копии делает. По части работы и резервного копирования всё прошло замечательно, а вот с восстановлением проблемы: если программа хоть раз обращалась к базе, то восстановление невозможно, т.к. "Exclusive access could not be obtained because the database is in use". И так происходит до тех пор, пока приложение не закроется.
Пытался коннекшену делать: Dispose(), загонял его в using (...), пробовал трогать GC, но всё впустую.
Здравствуйте, _deniska, Вы писали:
_>Суть такова: нужно написать программку, которая работает с базой (MS SQL), при необходимости (когда захочет пользователь) восстанавливает её из резервной копии, а также эти резервные копии делает. По части работы и резервного копирования всё прошло замечательно, а вот с восстановлением проблемы: если программа хоть раз обращалась к базе, то восстановление невозможно, т.к. "Exclusive access could not be obtained because the database is in use". И так происходит до тех пор, пока приложение не закроется.
_>Пытался коннекшену делать: Dispose(), загонял его в using (...), пробовал трогать GC, но всё впустую.
_>Надеюсь на вашу помощь, заранее спасибо.
Всё дело в пуле соединений. Если ты хоть раз открыл соединени, то даже после диспоза соединения, соединение в пуле не закрывается, а продолжает там висеть открытым, пока не закроется приложение, или пока не пройдёт какое-то количество времени (дефалт — 60 секунд) бездействия. Всё это сделано для оптимизации, т.к. открытие конекшина — очень прожорливая операция. Тут есть несколько путей решения:
1. Можно работать с БД в отдельном домене, и выгружать домен, когда нужно, после этого базу можно убивать (имхо геморно)
2. Можно в строке подключения использовать флаг Pooling=False; (имхо тормозно, если много раз открываешь соединение)
3. Сделать SqlConnection.ClearAllPools(); самый простой и доступный вариант, после него все соединения с БД умрут жестокой смертью
Здравствуйте, xdeltax, Вы писали:
X>Всё дело в пуле соединений. Если ты хоть раз открыл соединени, то даже после диспоза соединения, соединение в пуле не закрывается, а продолжает там висеть открытым, пока не закроется приложение, или пока не пройдёт какое-то количество времени (дефалт — 60 секунд) бездействия. Всё это сделано для оптимизации, т.к. открытие конекшина — очень прожорливая операция. Тут есть несколько путей решения:
X>1. Можно работать с БД в отдельном домене, и выгружать домен, когда нужно, после этого базу можно убивать (имхо геморно) X>2. Можно в строке подключения использовать флаг Pooling=False; (имхо тормозно, если много раз открываешь соединение) X>3. Сделать SqlConnection.ClearAllPools(); самый простой и доступный вариант, после него все соединения с БД умрут жестокой смертью
Большое спасибо, всё сразу заработало.
Понравился больше всего 3-й вариант, так как восстановление должно происходить не чаще раза в день, а быстродействие ещё никогда небыло лишним.