Firebird не отпускает файлик базы.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Firebird не отпускает файлик базы.

Сообщение Pavel Egorov » 08 авг 2005, 10:32

Хочется использовать Firebird 1.5 Embedded для unit-тестирования работы приложения с базой. Для этого надо часто создавать и удалять базы. Но вылезла такая проблема: после закрытия соединения файл БД невозможно удалить до тех пор, пока не завершится процесс, открывшавщий соединение с этой базой.

Работа идёт через Firebird .NET Provider.
connection.Close();
connection.Dispose();
не помогают...

Как результат, не получается сделать совершенно простую штуку: Из программы создать базу, что-то с ней поделать, а потом её удалить.

Может я чего-то важного не знаю? :roll:

UPDATE:
Проблема полностью решилась. Как это часто и бывает, это оказалась фича, а не баг :D

Надо было всего лишь подкрутить строку подключения добавив туда "Pooling=false". По умолчанию он true, а когда он true, то закрывающиеся соединения на самом деле не закрываются а складываются в пул. Собственно из-за этого и проблемы были.
Последний раз редактировалось Pavel Egorov 17 авг 2005, 07:26, всего редактировалось 1 раз.

root
Сообщения: 5
Зарегистрирован: 06 авг 2005, 04:35

Re: Firebird не отпускает файлик базы.

Сообщение root » 08 авг 2005, 11:36

Похоже, все таки содинение не закрыто

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 08 авг 2005, 12:30

не парьте мозг :) уж сколько раз говорено, что для отладки (а в данном случае и для тестирования) вместо Embedded нужно использовать обычный сервер.
Из программы создать базу, что-то с ней поделать, а потом её удалить.
Как бы, считается, что так никто не делает. то есть, создать базу из приложения, а потом грохнуть - имеет мало смысла.

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Re: Firebird не отпускает файлик базы.

Сообщение Pavel Egorov » 08 авг 2005, 12:34

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)
И как же с этим можно бороться?

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Сообщение Pavel Egorov » 08 авг 2005, 12:49

kdv писал(а):не парьте мозг :)
Спасибо за ценный совет :D
уж сколько раз говорено, что для отладки (а в данном случае и для тестирования) вместо Embedded нужно использовать обычный сервер.
...но с классическим сервером все в точности так же...
Из программы создать базу, что-то с ней поделать, а потом её удалить.
Как бы, считается, что так никто не делает. то есть, создать базу из приложения, а потом грохнуть - имеет мало смысла.
А как бы зря так считается.
Хочется для тестирования иметь лёгкий сервер бд, не требующий установки. Зачем это хочется - не особо важно - скажем, этого требует организация труда у нас в отделе, а взамен даёт много приемуществ. :) И вроде бы всем подходит FB Embedded, кроме этой лажи...

Неужели это никак не лечится?

root
Сообщения: 5
Зарегистрирован: 06 авг 2005, 04:35

Сообщение root » 08 авг 2005, 13:32

Pavel Egorov писал(а):
Неужели это никак не лечится?
Ну отчего же, тормозни сервер программно на вермя удаления (хи-хи)..

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 08 авг 2005, 13:42

я хотел попробовать то же самое на IBX, но времени нет. Рекомендую проверить. хотя бы будет приблизительно понятно, кто именно и что там удерживает.

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Сообщение Pavel Egorov » 08 авг 2005, 14:12

root писал(а): Ну отчего же, тормозни сервер программно на вермя удаления (хи-хи)..
Осталось только понять, что означает слова "тормозни сервер" в случае Embedded :roll:

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 08 авг 2005, 14:14

полагаю, что реализация CreateDatabase оставляет хендл активным. Это можно проверить, оставив в коде только CreateDatabase и DropDatabase. Если не оно, то возможно пул активен и пользовательское соединение не закрывается сразу по вызову Close.

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Сообщение Pavel Egorov » 08 авг 2005, 14:45

Вы будете смеяться... Решал ещё минут 30 потратить на эту проблеммку:

Дошёл в отладчике до строчки DropDatabase (на которой всё падало), остановил службу FB, попробовал удалить файл с БД.
Не получилось! :shock:

То есть файл кто-то держит даже при остановленном сервере. Это для меня как-то уж совсем непонятно...

Если оставить только Create и Drop, то все работает без проблем. Проблемы возникают только при открытии соединения с БД между Create и Drop. Что бы это могло означать? :?:

Если перед Drop-ом подождать некоторое время (секунд 10), то поведение не меняется. Однако файлик отпускается сразу как только приложение завершает работу...

root
Сообщения: 5
Зарегистрирован: 06 авг 2005, 04:35

Сообщение root » 08 авг 2005, 15:02

Pavel Egorov писал(а):
root писал(а): Ну отчего же, тормозни сервер программно на вермя удаления (хи-хи)..
Осталось только понять, что означает слова "тормозни сервер" в случае Embedded :roll:
Оно и имелось ввиду, остановить службу.
А посмотри на список окрытых файлов на сервере. Может сам сервер оставляет файл открытым (в смысле Windwows или Linux, какой у тебя там....)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 08 авг 2005, 15:30

чудится мне, это .Net внутри себя не отпускает коннект.

а вообще интересно - у вас там на всех тачках .Net Framework стоит, и вы все (последние) приложения на .Net пишете? ну и как оно?

Vas
Сообщения: 22
Зарегистрирован: 31 мар 2005, 19:12

Сообщение Vas » 08 авг 2005, 18:04

Попробуй пнуть мусосросборщик перед этим (сам не пробовал, но может и поможет):

GC.Collect();
GC.WaitForPendingFinalyzers();
GC.Collect();

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Сообщение Pavel Egorov » 09 авг 2005, 08:40

GC не помогает - это я уже пробовал от отчаяния. Симптомы те же... :(

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 09 авг 2005, 10:24

Подобная тема здесь уже обсуждалась. Насколько я понимаю - проблема в .net драйвере. Пишите Карлосу и он разберётся

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 авг 2005, 10:40

я просто напомню, что есть такой сайт - www.sysinternals.com. И там есть разные утилитки, которые позволяют смотреть практически все - и кто какие файлы держит, и вообще.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 09 авг 2005, 15:10

Pavel Egorov писал(а): Хочется для тестирования иметь лёгкий сервер бд, не требующий установки. Зачем это хочется - не особо важно - скажем, этого требует организация труда у нас в отделе, а взамен даёт много приемуществ. :) И вроде бы всем подходит FB Embedded, кроме этой лажи...
Вот ведь интересно. Есть некоторая штука. Разработанная для некоторого специфического применения. Известно как ей следует пользоваться и как не следует. И известно почему так не следует. Безотносительно предполагаемого глюка в провайдере. Тем не менее, с завидным постояноством появляются посты - а мне было бы удобно если бы эта штука была бы предназначена не для того, для чего предназначена и была бы устроена не так, как она устроена. Вот представьте себе обращение к M$.

M$ выпускает такую программу, называется Word. Организация труда у нас в отделе требует, чтобы ею можно было бы обрабатывать фотографии так же, как программой Photoshop. От этого было бы много преимуществ. Программа Word всем нам подходит, если бы не эта лажа.

А ещё добавить, не в тему, но для окончательного соответствия российскому колориту - мы программы никогда не покупали, не покупаем и покупать не будем, но создаётся впечатление, что M$ совершенно не заинтересовано в продвижении своих программ в нашей среде :-D

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Сообщение Pavel Egorov » 09 авг 2005, 20:21

Спасибо Вам Merlin за неоценимую помощь в решении моей проблемы. Я никогда не забуду тех ценнейших советов, что Вы соизволили мне дать.

Не, ну в натуре, разве я многого требую от Firebird? :oops:
Вполне себе нормальная задача. Отконнектиться от базы и Drop-нуть её.
Оказывается, что FB + .NET Provider на это не способны, но тут же находится великий и мудрейший Мерлин, который (видимо по инерции) начинает говорить, что я выбрал себе не тот инструмент. Я лично себе СУБД выбирал. И вроде как (по слухам) FB таковой является. Неужели меня подло обманули? :roll:

PS. Завтра, если не осенит, буду писать Карлосу...
Если будут результаты напишу сюда.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 09 авг 2005, 20:38

Та на здоровье. Могу ещё в порядке делёжки мудростью добавить наблюдение, что означенная категория отченно любит вставать в позу и делать вид что не понимает обо што речь (а мож и вправду не понимает) и картинно пугать ежа голой жопой, т.е. собеседника возможностью своего отказа от FB. В контексте темы - патамушта при разработке надо юзать супер или классику, а embedded - только для распространения. Вот никак не могу определиться с ТЛ - следующий вопль будет про то, что с ним (с embedded) практически невозможно отлаживать программы, или что невозможно коннектиться с Эксперта при запущенном приложении или потребуют коннектиться к базе на расшаренном сетевом диске. Ацтой FB, ацтой.

Pavel Egorov
Сообщения: 11
Зарегистрирован: 08 авг 2005, 10:22

Сообщение Pavel Egorov » 09 авг 2005, 21:04

И что ты взъерошился на меня без повода?! Проблема есть, я её пытаюсь решить для себя, вылез сюда за помощью, все люди по людски разговаривают, а ты зачем-то ворчать пытаешься...

Выключай флеймилку! :wink:

Ответить