Restore database: как восстановить БД?
От: _deniska  
Дата: 13.08.07 12:22
Оценка:
Суть такова: нужно написать программку, которая работает с базой (MS SQL), при необходимости (когда захочет пользователь) восстанавливает её из резервной копии, а также эти резервные копии делает. По части работы и резервного копирования всё прошло замечательно, а вот с восстановлением проблемы: если программа хоть раз обращалась к базе, то восстановление невозможно, т.к. "Exclusive access could not be obtained because the database is in use". И так происходит до тех пор, пока приложение не закроется.

Пытался коннекшену делать: Dispose(), загонял его в using (...), пробовал трогать GC, но всё впустую.

Надеюсь на вашу помощь, заранее спасибо.
Re: Restore database: как восстановить БД?
От: xdeltax  
Дата: 13.08.07 12:39
Оценка: 3 (1) +1
Здравствуйте, _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(); самый простой и доступный вариант, после него все соединения с БД умрут жестокой смертью
Re[2]: Restore database: как восстановить БД?
От: _deniska  
Дата: 13.08.07 12:52
Оценка:
Здравствуйте, xdeltax, Вы писали:

X>Всё дело в пуле соединений. Если ты хоть раз открыл соединени, то даже после диспоза соединения, соединение в пуле не закрывается, а продолжает там висеть открытым, пока не закроется приложение, или пока не пройдёт какое-то количество времени (дефалт — 60 секунд) бездействия. Всё это сделано для оптимизации, т.к. открытие конекшина — очень прожорливая операция. Тут есть несколько путей решения:


X>1. Можно работать с БД в отдельном домене, и выгружать домен, когда нужно, после этого базу можно убивать (имхо геморно)

X>2. Можно в строке подключения использовать флаг Pooling=False; (имхо тормозно, если много раз открываешь соединение)
X>3. Сделать SqlConnection.ClearAllPools(); самый простой и доступный вариант, после него все соединения с БД умрут жестокой смертью

Большое спасибо, всё сразу заработало.

Понравился больше всего 3-й вариант, так как восстановление должно происходить не чаще раза в день, а быстродействие ещё никогда небыло лишним.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.