Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточная прога на FB 2, непонятные косяки при журналировании 
:(
    Опции темы
ksili
Дата 10.10.2007, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Даже не знаю, куда написать, сюда, в C++Builder или ещё куда...

Пишу программу на C++Builder с использованием FIBPlus. В программе несколько дочерних потоков. Каждый работает с БД. В каждом динамически создаются необходимые для работы с БД компоненты (как правило, один TpFIBDatabase, один TpFIBQuery и несколько TpFIBTransaction). 

Периодически возникают ошибки при работе с БД. Я эти ошибки ловлю компонентой pFIBErrorHandler и сохраняю в файл сообщения об ошибке. Сообщения абсолютно бредовые, я весь код перерыл, явно нигде такой чуши послаться серверу БД не могло. Вот пара сообщений:
Код

SQLCode = -104
IBErrorCode = 335544569
IBMessage = Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, column 19.
81.

SQLCode = -901
IBErrorCode = 335544711
IBMessage = Attempt to execute an unprepared dynamic SQL statement.

SQLCode = -901
IBErrorCode = 335544711
IBMessage = Attempt to execute an unprepared dynamic SQL statement. 

Код

SQLCode = -804
IBErrorCode = 335544569
IBMessage = Dynamic SQL Error.
SQL error code = -804.
Count of read-write columns does not equal count of values.

SQLCode = -901
IBErrorCode = 335544711
IBMessage = Attempt to execute an unprepared dynamic SQL statement.

SQLCode = -901
IBErrorCode = 335544711
IBMessage = Attempt to execute an unprepared dynamic SQL statement. 

Код

SQLCode = -104
IBErrorCode = 335544569
IBMessage = Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 34.
00.

SQLCode = -901
IBErrorCode = 335544711
IBMessage = Attempt to execute an unprepared dynamic SQL statement.

SQLCode = -901
IBErrorCode = 335544711
IBMessage = Attempt to execute an unprepared dynamic SQL statement. 

Было также замечено, что ошибки возникают только когда отключено журналирование SQL-запросов! Журналирую так: для события BeforeExecute каждой квери назначаю обработчик:
Код

MainQuery->BeforeExecute = (TNotifyEvent)&SQLlogging_1;

void __fastcall TConferenceThread::SQLlogging_1()
{
 if(!All_ch->LogSQL) return;      //журналирование вкл/откл

 try
    {
     All_ch->chnls[this_ch].log->Add(MainQuery->SQL->Text);
     All_ch->chnls[this_ch].log->SaveToFile(logname);
     All_ch->chnls[this_ch].DirtyLog = true;
    }
 catch(...)
    {
     return;
    }
}

All_ch - указатель на глобальную структуру в основном потоке
All_ch->chnls[this_ch] - обращение к структуре описания одного потока (каждый поток вроде обращается только к "своей" строке в этом массиве структур
All_ch->chnls[this_ch].log - это собственно указатель на компонент TJvLogFile для ведения журнала (у каждого потока свой журнал) 

Самое интересное, что косяки происходят при выключенном журналировании! (оно отключается сразу для всех потоков). То есть когда дальше первой строки в функции SQLlogging_1 не уходит. Из-за этого и поймать эти ошибки не получается

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
jsa
Дата 10.10.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 704
Регистрация: 19.1.2006
Где: Новосибирск

Репутация: 1
Всего: 20



скорее всего это происходит из-за рассинхронизации потоков, проверь код, определи критические секции (создание, использование освобождение компонентов), используй синхронизацию, может быть можно где-то вставить семафоры и т.д.



--------------------
Все мы, на перине с песней, строим небо на земле © Ю. Шевчук
PM MAIL ICQ   Вверх
ksili
Дата 10.10.2007, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Ну это всё понятно... слишком уж широкий совет.
Просто мистика какая-то: глючит, когда журналирование отключено, а не наоборот. Было бы это только при включенном журналировании,было б понятно, что надо искать косяк в работе с журналом. 
Я вообще в Билдере использую стандартный класс для потоков TThread. Критические секции и семафора никогда не использовал. 

Вопрос на засыпку: надо ли обращение из дочернего потока к глобальной структуре в основном потоке запихивать в Synchronize (ну или в критическую секцию)?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.