Доступ к FB из различных потоков

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

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

Ответить
S. Makhortov
Сообщения: 8
Зарегистрирован: 26 мар 2006, 17:32

Доступ к FB из различных потоков

Сообщение S. Makhortov » 22 июл 2006, 09:24

Не возникало ли у кого-нибудь проблем с subj? Конкретнее, у меня один thread пишет в БД, другой читает. Происходит нерегулярное зависание пишущего потока при выполнении API-вызова isc_put_segment(). В чем может быть дело?

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

Сообщение dimitr » 22 июл 2006, 12:49

а потоки ты синхронизируешь?

S. Makhortov
Сообщения: 8
Зарегистрирован: 26 мар 2006, 17:32

Сообщение S. Makhortov » 24 июл 2006, 08:22

Вопрос слишком абстрактен. Нет ли дополнительных требований синхронизации, касающихся доступа к FB?

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

Сообщение dimitr » 24 июл 2006, 08:46

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

S. Makhortov
Сообщения: 8
Зарегистрирован: 26 мар 2006, 17:32

Сообщение S. Makhortov » 26 июл 2006, 15:15

К сожалению, не все так определенно. Когда используется отдельное соединение (ISC_DB_HANDLE) на каждый поток без синхронизации, все равно потоки виснут при одновременном входе в какие-нибудь функции IB API. Если операции доступа синхронизировать (критические секции), то количество аттачей роли не играет и программа вроде бы работает. Однако, если искусственно повысить интенсивность обращений к gds32.dll, то рано или поздно один поток повисает, а остальные бесконечно ждут его в связи с синхронизацией. Может быть, известны еще какие-нибудь нюансы?

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

Сообщение Merlin » 26 июл 2006, 15:19

Локальный коннект?

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

Сообщение hvlad » 26 июл 2006, 15:31

S. Makhortov писал(а):Может быть, известны еще какие-нибудь нюансы?
вызовы isc_attach_database нужно сериализовать
версию севера и клиента нужно сообщать

S. Makhortov
Сообщения: 8
Зарегистрирован: 26 мар 2006, 17:32

Сообщение S. Makhortov » 26 июл 2006, 15:48

Коннект локальный. Версия FB 1.5, также проверял на IB 6. Сериализовать - это хороший совет. Но, как сказано выше, при одном коннекте и сериализации доступа при интенсивной нагрузке один поток виснет и т.д. М.б. сервер не успевает завершить текущую операцию, когда поступает новая? Хотя, это не в моей компетенции.

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

Сообщение Merlin » 26 июл 2006, 15:53

По TCP соединяйся, через localhost. И будет тебе щастье. Во всяком случае, должно :)

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

Сообщение dimitr » 26 июл 2006, 16:02

S. Makhortov писал(а):Коннект локальный.
он в версиях до FB2 не умеет работать параллельно

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 26 июл 2006, 16:06

Лучше поздно, чем никогда...
http://www.ibase.ru/devinfo/ibx.htm. Раздел TIBDatabase.

S. Makhortov
Сообщения: 8
Зарегистрирован: 26 мар 2006, 17:32

Сообщение S. Makhortov » 26 июл 2006, 16:24

Спасибо.

Ответить