IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
bachin
- Сообщения: 16
- Зарегистрирован: 20 апр 2006, 17:17
Сообщение
bachin » 08 ноя 2006, 12:08
Пишу свою обвертку над FB API. Хотелось бы сразу реализовать потокобезопастность. gds32 от IB в свое время страдал проблемой паралельного создания конектов в контексте библиотеки, стейтментов в контексте коннекта и т.д..
интересуют следующие вопросы:
1. осталась ли эта проблема?
2. где найти инфу по связкам обектов, которые надо лочить?
например:
Код: Выделить всё
isc_dsql_alloc_statement2(@status ,@db_handle, @stmt_handle);
Код: Выделить всё
isc_dsql_prepare(@status, @trans_handle, @stmt_handle, 0, PChar(sql), SQL_DIALECT_CURRENT, nil);
в первом случае надо лочить создание обектов в контексте базы, а во втором в контексте транзакции?
-
Dimitry Sibiryakov
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Сообщение
Dimitry Sibiryakov » 09 ноя 2006, 13:26
Еманов утверждал что достаточно сериализовать только коннекты. Ну, и, конечно, не лезть в один коннект из разных потоков.
-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 09 ноя 2006, 15:09
Dimitry Sibiryakov писал(а):Еманов утверждал что достаточно сериализовать только коннекты. Ну, и, конечно, не лезть в один коннект из разных потоков.
Одновременно! Не лезть одновременно
-
bachin
- Сообщения: 16
- Зарегистрирован: 20 апр 2006, 17:17
Сообщение
bachin » 09 ноя 2006, 16:00
hvlad писал(а):Dimitry Sibiryakov писал(а):Еманов утверждал что достаточно сериализовать только коннекты. Ну, и, конечно, не лезть в один коннект из разных потоков.
Одновременно! Не лезть одновременно
вот и я так подумал

можно только уточнить, насколько "одновременно"?
т.е если я сделал statement.prepare->execute и идет fetch, тобишь я работаю с хендлом стейтмента, я уже могу с другого потока создавать другой стейтмент или пока все порожденные от этого коннекта объекты не закрою еще нельзя?
-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 09 ноя 2006, 17:09
bachin писал(а):hvlad писал(а):Dimitry Sibiryakov писал(а):Еманов утверждал что достаточно сериализовать только коннекты. Ну, и, конечно, не лезть в один коннект из разных потоков.
Одновременно! Не лезть одновременно
вот и я так подумал

можно только уточнить, насколько "одновременно"?
Нельзя одновременно вызывать API для одного database handle в двух потоках
-
bachin
- Сообщения: 16
- Зарегистрирован: 20 апр 2006, 17:17
Сообщение
bachin » 09 ноя 2006, 18:21
hvlad писал(а):Нельзя одновременно вызывать API для одного database handle в двух потоках
я еще немного уточну...
с критикал секцией с контексте db handle:
transaction -> start, commin, rollback
statement -> create
без критикал секции:
statement -> prepare, execute, fetch, free, describe_bind, describe
(блобы пока не рассматриваем)
-
bachin
- Сообщения: 16
- Зарегистрирован: 20 апр 2006, 17:17
Сообщение
bachin » 13 ноя 2006, 12:50
hvlad писал(а):[Нельзя одновременно вызывать API для одного database handle в двух потоках
даж и незнаю что сказать...
погонял стресс тестирование
100 000 потоков, через каждую 1000 слип на секунду (а то у винды крыша едет - не умеет она столько потоков открывать)
все работают в одном коннекте.
операции простые - создал транзакцию, создал стейтмент, сбиндил инпут параметры, экзекюте, фетч, аутпут, закрыл стейтмент, закрыл транзакцию....
никаких критикал сэкшн и никаких накладок.
может кто точно сказать, где всетаки идет конкурентный доступ нуждающийся в разруливании на клиенте....
-
aaa3d
- Сообщения: 69
- Зарегистрирован: 23 ноя 2005, 11:06
Сообщение
aaa3d » 20 ноя 2006, 15:59
наталкиваю на мысль.
Предполагаю что комп у тебя однопроцессорный.
у тебя потоков много, но в один момент времени работает только ОДИН.
соответственно кое-какое временное разруливание получается на уровне операционки.
прогони свой тест на двухядерной машинке, наверняка что нить упадет.
-
bachin
- Сообщения: 16
- Зарегистрирован: 20 апр 2006, 17:17
Сообщение
bachin » 21 ноя 2006, 10:59
aaa3d писал(а):наталкиваю на мысль.
Предполагаю что комп у тебя однопроцессорный.
у тебя потоков много, но в один момент времени работает только ОДИН.
соответственно кое-какое временное разруливание получается на уровне операционки.
на самом деле, работа со списками не атомарная задача и для получения gpf не требуется многопроцессорная тачка... но дело даже не в этом, вопрос стоял по-другому, какие обекты требуют конкурентного доступа и какие эксклюзивного.
-
malefik
- Сообщения: 2
- Зарегистрирован: 29 ноя 2006, 10:29
Сообщение
malefik » 29 ноя 2006, 10:47
Господа! Сам наткнулся на грабли (с несколькими потоками) ......однако прочитав ваши посты все встало более менее понятно.....НО....хотелось бы прояснить ситуацию и получить четкие ответы....ЕСЛИ ВАС НЕ ЗАТРУДНИТ!
Вобщем...у меня создаются несколько нитей Tthread ....в каждой нитке создаются объекты для работы с базой...
Код: Выделить всё
_query = new TpFIBQuery(mainForm->FIBDatabase);
_transaction = new TpFIBTransaction(mainForm->FIBDatabase);
затем присваиваем соответствующие свойства ....для работы на один компонент FibDatabase который находится в основной нити приложения т.е. лежит на форме.
вобщем периодически все это хозяйство падает......теперь уже знаю почему.....
Вопрос .....как можно организовать нормальную работу......? Использование метода Synchronize ? даст положительные результаты?
Если да то что туда затолкать ? старттранзакшн....екзецкуэри....коммит.....? либо все??? Как это скажется на работе основной нити приложения.....?? она при долгих ожиданиях будет останавливатся?потоков в приложении у меня может быть не одна сотня.....А может организовывать отдельный коннект для каждой нити ......это будет изврат...? Как порекомендуете разрешить данную проблему? Спасибо! Надеюсь на помощь....
P.S. Проц у меня действительно 2х ядерный
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 29 ноя 2006, 11:00
А может организовывать отдельный коннект для каждой нити ......это будет изврат...?
это не изврат, это FAQ.
www.ibase.ru/ibfaq.htm