ZeosDBO, PgBouncer и многопоточность
Добавлено: 01.11.2019 18:16:36
Имеем: PostgreSQL 9.5/9.6, все на Ubuntu. Там же PgBouncer 1.9 версии
Клиент - Win8.1 x64, Lazarus 2.0.6, FPC 3.0.4, ZeosDBO 7.2.6 (на предыдущем 7.2.4 аналогично)
Приложение многопоточное, область - неважно, в принципе. Но нужно одновременно подключаться к десяткам баз. На каждую базу - два потока, в каждом собственные коннекты Коннект ровно один на поток. Соответственно, имеем массив потоков TThread. Создается штатно через Create.
И вроде бы все работает, все создается и подключается... Но регулярно Zeos теряет коннект, при попытке реконнекта - прога полностью впадает в ступор, то есть виснет насмерть. Убивается только из диспетчера задач. В лог самого приложения много не попадает, но заметил вот такое:
А в логах сервера при этом:
Получается, что не сервер рвет соединение, а сими Zeos?
Вот куда рыть? Хотя бы примерно... Отказаться от боунсера не предлагать, клиентов очень много, а возможности серверов ограничены.
P.S.
UniDAC тоже пробовал - он вообще не умеет через боунсер общаться. А если и можно заставить в редкие мгновения просветления, то лучше б он вообще не работал никак.
P.P.S.
Каких-то других компонентов нет? Может, я плохо искал?
Клиент - Win8.1 x64, Lazarus 2.0.6, FPC 3.0.4, ZeosDBO 7.2.6 (на предыдущем 7.2.4 аналогично)
Приложение многопоточное, область - неважно, в принципе. Но нужно одновременно подключаться к десяткам баз. На каждую базу - два потока, в каждом собственные коннекты Коннект ровно один на поток. Соответственно, имеем массив потоков TThread. Создается штатно через Create.
- Код: Выделить всё
constructor TFirmThread.Create(fSuspended: Boolean);
begin
inherited Create(fSuspended);
fTerminated := False;
CardAlreadyOpen := False;
Priority := tpNormal;
FreeOnTerminate := True;
zConn_m := TZConnection.Create(dmMain);
.....
Start;
И вроде бы все работает, все создается и подключается... Но регулярно Zeos теряет коннект, при попытке реконнекта - прога полностью впадает в ступор, то есть виснет насмерть. Убивается только из диспетчера задач. В лог самого приложения много не попадает, но заметил вот такое:
- Код: Выделить всё
SQL_First SQL Error: лишние данные в сообщении "T"
...
Database connection component is not assigned Closed
А в логах сервера при этом:
- Код: Выделить всё
LOG: could not receive data from client: Соединение разорвано другой стороной
Получается, что не сервер рвет соединение, а сими Zeos?
Вот куда рыть? Хотя бы примерно... Отказаться от боунсера не предлагать, клиентов очень много, а возможности серверов ограничены.
P.S.
UniDAC тоже пробовал - он вообще не умеет через боунсер общаться. А если и можно заставить в редкие мгновения просветления, то лучше б он вообще не работал никак.
P.P.S.
Каких-то других компонентов нет? Может, я плохо искал?