Страница 1 из 2
Firebird не отпускает файлик базы.
Добавлено: 08 авг 2005, 10:32
Pavel Egorov
Хочется использовать Firebird 1.5 Embedded для unit-тестирования работы приложения с базой. Для этого надо часто создавать и удалять базы. Но вылезла такая проблема: после закрытия соединения файл БД невозможно удалить до тех пор, пока не завершится процесс, открывшавщий соединение с этой базой.
Работа идёт через Firebird .NET Provider.
connection.Close();
connection.Dispose();
не помогают...
Как результат, не получается сделать совершенно простую штуку: Из программы создать базу, что-то с ней поделать, а потом её удалить.
Может я чего-то важного не знаю?
UPDATE:
Проблема полностью решилась. Как это часто и бывает, это оказалась фича, а не баг
Надо было всего лишь подкрутить строку подключения добавив туда "Pooling=false". По умолчанию он true, а когда он true, то закрывающиеся соединения на самом деле не закрываются а складываются в пул. Собственно из-за этого и проблемы были.
Re: Firebird не отпускает файлик базы.
Добавлено: 08 авг 2005, 11:36
root
Похоже, все таки содинение не закрыто
Добавлено: 08 авг 2005, 12:30
kdv
не парьте мозг

уж сколько раз говорено, что для отладки (а в данном случае и для тестирования) вместо Embedded нужно использовать обычный сервер.
Из программы создать базу, что-то с ней поделать, а потом её удалить.
Как бы, считается, что так никто не делает. то есть, создать базу из приложения, а потом грохнуть - имеет мало смысла.
Re: Firebird не отпускает файлик базы.
Добавлено: 08 авг 2005, 12:34
Pavel Egorov
root писал(а):Похоже, все таки содинение не закрыто
Вот, что я написал:
Код: Выделить всё
File databaseFile = ...
FbConnectionStringBuilder builder = new FbConnectionStringBuilder();
builder.ServerType = 1;
builder.UserID = "SYSDBA";
builder.Password = "masterkey";
builder.Dialect = 3;
builder.Database = databaseFile.FullPath;
string connectionString = builder.ToString();
FbConnection.CreateDatabase(connectionString);
try
{
// ели это раскомментировать а using закомментировать, то ничего не изменится.
// IDbConnection connection = new FbConnection(connectionString);
// connection.Open();
// connection.Close();
// connection.Dispose();
using(IDbConnection connection = new FbConnection(connectionString))
{
connection.Open();
connection.Close();
}
}
finally
{
FbConnection.DropDatabase(connectionString);
}
Ошибка возникает на DropDatabase:
Код: Выделить всё
FirebirdSql.Data.Firebird.FbException : lock time-out on wait transaction
object C:\...\TEST.FDB is in use
at FirebirdSql.Data.Firebird.FbConnection.DropDatabase(String connectionString)
И как же с этим можно бороться?
Добавлено: 08 авг 2005, 12:49
Pavel Egorov
kdv писал(а):не парьте мозг
Спасибо за ценный совет
уж сколько раз говорено, что для отладки (а в данном случае и для тестирования) вместо Embedded нужно использовать обычный сервер.
...но с классическим сервером все в точности так же...
Из программы создать базу, что-то с ней поделать, а потом её удалить.
Как бы, считается, что так никто не делает. то есть, создать базу из приложения, а потом грохнуть - имеет мало смысла.
А как бы зря так считается.
Хочется для тестирования иметь лёгкий сервер бд, не требующий установки. Зачем это хочется - не особо важно - скажем, этого требует организация труда у нас в отделе, а взамен даёт много приемуществ.

И вроде бы всем подходит FB Embedded, кроме этой лажи...
Неужели это никак не лечится?
Добавлено: 08 авг 2005, 13:32
root
Pavel Egorov писал(а):
Неужели это никак не лечится?
Ну отчего же, тормозни сервер программно на вермя удаления (хи-хи)..
Добавлено: 08 авг 2005, 13:42
kdv
я хотел попробовать то же самое на IBX, но времени нет. Рекомендую проверить. хотя бы будет приблизительно понятно, кто именно и что там удерживает.
Добавлено: 08 авг 2005, 14:12
Pavel Egorov
root писал(а):
Ну отчего же, тормозни сервер программно на вермя удаления (хи-хи)..
Осталось только понять, что означает слова "тормозни сервер" в случае Embedded

Добавлено: 08 авг 2005, 14:14
dimitr
полагаю, что реализация CreateDatabase оставляет хендл активным. Это можно проверить, оставив в коде только CreateDatabase и DropDatabase. Если не оно, то возможно пул активен и пользовательское соединение не закрывается сразу по вызову Close.
Добавлено: 08 авг 2005, 14:45
Pavel Egorov
Вы будете смеяться... Решал ещё минут 30 потратить на эту проблеммку:
Дошёл в отладчике до строчки DropDatabase (на которой всё падало), остановил службу FB, попробовал удалить файл с БД.
Не получилось!
То есть файл кто-то держит даже при остановленном сервере. Это для меня как-то уж совсем непонятно...
Если оставить только Create и Drop, то все работает без проблем. Проблемы возникают только при открытии соединения с БД между Create и Drop. Что бы это могло означать?
Если перед Drop-ом подождать некоторое время (секунд 10), то поведение не меняется. Однако файлик отпускается сразу как только приложение завершает работу...
Добавлено: 08 авг 2005, 15:02
root
Pavel Egorov писал(а):root писал(а):
Ну отчего же, тормозни сервер программно на вермя удаления (хи-хи)..
Осталось только понять, что означает слова "тормозни сервер" в случае Embedded

Оно и имелось ввиду, остановить службу.
А посмотри на список окрытых файлов на сервере. Может сам сервер оставляет файл открытым (в смысле Windwows или Linux, какой у тебя там....)
Добавлено: 08 авг 2005, 15:30
kdv
чудится мне, это .Net внутри себя не отпускает коннект.
а вообще интересно - у вас там на всех тачках .Net Framework стоит, и вы все (последние) приложения на .Net пишете? ну и как оно?
Добавлено: 08 авг 2005, 18:04
Vas
Попробуй пнуть мусосросборщик перед этим (сам не пробовал, но может и поможет):
GC.Collect();
GC.WaitForPendingFinalyzers();
GC.Collect();
Добавлено: 09 авг 2005, 08:40
Pavel Egorov
GC не помогает - это я уже пробовал от отчаяния. Симптомы те же...

Добавлено: 09 авг 2005, 10:24
hvlad
Подобная тема здесь уже обсуждалась. Насколько я понимаю - проблема в .net драйвере. Пишите Карлосу и он разберётся
Добавлено: 09 авг 2005, 10:40
kdv
я просто напомню, что есть такой сайт -
www.sysinternals.com. И там есть разные утилитки, которые позволяют смотреть практически все - и кто какие файлы держит, и вообще.
Добавлено: 09 авг 2005, 15:10
Merlin
Pavel Egorov писал(а):
Хочется для тестирования иметь лёгкий сервер бд, не требующий установки. Зачем это хочется - не особо важно - скажем, этого требует организация труда у нас в отделе, а взамен даёт много приемуществ.

И вроде бы всем подходит FB Embedded, кроме этой лажи...
Вот ведь интересно. Есть некоторая штука. Разработанная для некоторого специфического применения. Известно как ей следует пользоваться и как не следует. И известно почему так не следует. Безотносительно предполагаемого глюка в провайдере. Тем не менее, с завидным постояноством появляются посты - а мне было бы удобно если бы эта штука была бы предназначена не для того, для чего предназначена и была бы устроена не так, как она устроена. Вот представьте себе обращение к M$.
M$ выпускает такую программу, называется Word. Организация труда у нас в отделе требует, чтобы ею можно было бы обрабатывать фотографии так же, как программой Photoshop. От этого было бы много преимуществ. Программа Word всем нам подходит, если бы не эта лажа.
А ещё добавить, не в тему, но для окончательного соответствия российскому колориту - мы программы никогда не покупали, не покупаем и покупать не будем, но создаётся впечатление, что M$ совершенно не заинтересовано в продвижении своих программ в нашей среде

Добавлено: 09 авг 2005, 20:21
Pavel Egorov
Спасибо Вам Merlin за неоценимую помощь в решении моей проблемы. Я никогда не забуду тех ценнейших советов, что Вы соизволили мне дать.
Не, ну в натуре, разве я многого требую от Firebird?
Вполне себе нормальная задача. Отконнектиться от базы и Drop-нуть её.
Оказывается, что FB + .NET Provider на это не способны, но тут же находится великий и мудрейший Мерлин, который (видимо по инерции) начинает говорить, что я выбрал себе не тот инструмент. Я лично себе СУБД выбирал. И вроде как (по слухам) FB таковой является. Неужели меня подло обманули?
PS. Завтра, если не осенит, буду писать Карлосу...
Если будут результаты напишу сюда.
Добавлено: 09 авг 2005, 20:38
Merlin
Та на здоровье. Могу ещё в порядке делёжки мудростью добавить наблюдение, что означенная категория отченно любит вставать в позу и делать вид что не понимает обо што речь (а мож и вправду не понимает) и картинно пугать ежа голой жопой, т.е. собеседника возможностью своего отказа от FB. В контексте темы - патамушта при разработке надо юзать супер или классику, а embedded - только для распространения. Вот никак не могу определиться с ТЛ - следующий вопль будет про то, что с ним (с embedded) практически невозможно отлаживать программы, или что невозможно коннектиться с Эксперта при запущенном приложении или потребуют коннектиться к базе на расшаренном сетевом диске. Ацтой FB, ацтой.
Добавлено: 09 авг 2005, 21:04
Pavel Egorov
И что ты взъерошился на меня без повода?! Проблема есть, я её пытаюсь решить для себя, вылез сюда за помощью, все люди по людски разговаривают, а ты зачем-то ворчать пытаешься...
Выключай флеймилку!
