Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Добрый день.

Помогите, пожалуйста.

Мне нужно в оконном приложении с встроенным WEB-сервером ( компонент IWStandAloneServer версии 9 ) принимать GET-запросы и работать с базой MySQL 8. Работаю по цепочке OLE DB For ODBC <-> MySQl ODBC драйвер (нативного провайдера OLE DB для MySQL нет).

ciMultiThreaded в ServerController включено.

В IntraWeb, в событии IWServerControllerBaseBeforeDispatch, оставил только разбор Request.Content и операцию добавления строк в базу. Сначала создается ADOConnection, потом ADOQuery, потом в таблицу вставляются данные. Все это на всякий случай обрамил CoInitialize(nil) и CoUninitialize.

К Intraweb обращаются всего 2 шт. TCP/IP клиента с разных IP-адресов. Интервал обращения каждого - 1 секунда. Запросы, конечно, не синхронизированы, поэтому иногда могут почти совпадать по времени.

После 1500 - 2000 строк, добавленных в базу, возникает Acces Violation. Один раз удалось вставить чуть более 10000 записей. Но валиться всегда.
10 июл 19, 12:53    [21924133]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Да, перед CoUninitialize сначала ADOQuery, потом ADOConnection уничтожаются.
10 июл 19, 12:57    [21924135]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Еще странность - если в потоке обработки оставить только создание ADO-соединения и его уничтожение в конце, то все работает.

Стоит в середину вставить создание ADO-запроса и производить выборку с двух клиентов, всего десяти первых строк из таблицы, в которую никто не пишет (в таблице есть около 1000 строк) то часа через пол опять возникает ошибка.
11 июл 19, 10:11    [21924589]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6467
может обдумать идею пула соединений?
11 июл 19, 12:57    [21924811]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6467
... хотя, судя по этому посту, я был не прав с пулом соединений
11 июл 19, 13:58    [21924908]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Есть опасение, что свой велосипед будет еще хуже.

Мне кажется, что если я при динамическом соpздании коннекта ADO не указал какой-то там параметр, не помню его имя, с значением (-2), то ADO создает свой пул.

Кроме того, еще и в ODBC есть свой встроенный пул, в диспетчере. Типа Micrisoft о нас позаботился :-)
Пул ODBC пробовал включать - без толу.

Кроме того, проблема, похоже, проявляется при вступлении в дело Query, коннекты-то создаются и уничтожаются без зависаний.
Хотя это очень умозрительно конечно, после выполнения запроса и коннеект уже далеко не в том программном состоянии, что при ожидании.

Можно конечно попробовать другую базу, с нативным OLE DB провайдером, но это практически один MSSql. Как его потом прикручивать на хостинг к PHP... нет, это не вариант.

Как-то ведь люди кладут в базу данные по запросам, поступающим на Indy серверы, Intraweb это почти тоже самое.

Правильно я понимаю, что при каждом запросе в IWServerControllerBaseBeforeDispatch создается независимый поток, в котором можно создать объекты доступа к данным, выполнить чтение/запись и уничтожить объекты?
11 июл 19, 14:08    [21924917]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Отключил встроенный в OLE DB пул. Скорость упала не критично.

Кажется, стало стабильнее. Пул в ODBC тоже пока отключен. Пока не падает на записи. Но это не точно.


Как думаете, может есть смысл поменять что-то еще в строке подключения? Курсор по умолчанию, серверный надо полагать.
Сделать без курсора? Клиентский надо думать не вариант точно.
11 июл 19, 19:26    [21925219]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Нет. Опять облом на 3291 записи. Придется, видимо, процедурно, в Delphi, проверять при каждой вставке, что запись корректно попала в базу. Вот обломно-то....
11 июл 19, 19:32    [21925221]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
А вообще, проблема в моем случае может быть глобально MDAC (ADO, OLEDEB) да и конкретный ODBC-драйвер для MySQL не стоит списывать.

Посоветуйте, пожалуйста, какие-либо бесплатные компоненты доступа к MySQL для Delphi? Чтоб уж попробовать подключаться и работать с базой через другую технологию.
12 июл 19, 08:07    [21925390]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Vlad F
Member

Откуда:
Сообщений: 815
AleksVoronezh,

Может стоит саму СУБД поменять? Тогда и с компонентами, даже штатными, будет попроще.
12 июл 19, 10:10    [21925484]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
alekcvp
Member

Откуда:
Сообщений: 1416
AleksVoronezh
Посоветуйте, пожалуйста, какие-либо бесплатные компоненты доступа к MySQL для Delphi? Чтоб уж попробовать подключаться и работать с базой через другую технологию.

Ну если для "попробовать" то Zeos вроде поддерживает MySQL. Правда сам я ею не пользовался.
12 июл 19, 11:13    [21925546]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6467
AleksVoronezh,


У меня есть положительный опыт с SciBit MyComponents VCL Suite, но их сайта что то больше нет www.scibit.com :( Жалко, прекрасные компоненты. В интернете они до сих пор находятся. но не знаю, законно ли их использовать ...

Так же часто на форумах проскакивала библиотека ZeosLib, но я сам опыта не имел с ней, так что не скажу.

И смотрите на лицензию, чтобы на GPL не наткнуться. Как здесь, например: MySQL direct (смотрите, там можно скачать юниты DirectMysqlObject.zip и демку DemoObjectsWin.zip или перейти на сайт проекта на sourceforge)
12 июл 19, 11:24    [21925564]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3260
AleksVoronezh,

Zeos
12 июл 19, 11:25    [21925566]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Спасибо, к Zeos обязательно присмотрюсь.

Пока же снес MySQL 8.0 (64bit) и ODBC драйвер (32bit) из его же инсталлятора.


Поставил MySQL 5.7.26 (32 bit) и ODBC из его же инсталлятора. На сейчас вставлено 12700 записей и полет нормальный.
Но вся эта ситуация очень странная, очень.

Нужно будет еще попробовать пописать в MySQL 5.7.26 (64 bit), кто знает, что будет у провайдера например....
12 июл 19, 23:41    [21926069]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
>> И смотрите на лицензию, чтобы на GPL не наткнуться.

Поясните, пожалуйста. Правильно я понимаю, что MySQL Community можно без ограничений использовать в коммерческих проектах в том числе, а клиентские DLL от MySQL, которые использует Zeos, налагают какие-то ограничения?
13 июл 19, 10:50    [21926116]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Dimitry Timokhov
Member

Откуда: Москва
Сообщений: 33
AleksVoronezh,

Не далее как недавно тоже озаботился использования ADO в многопоточном режиме.

Сам пока не разобрался.

Но понял одно:
CoInitialize(nil) - создает single threaded appartment (только не спрашивай что это - 20+ проф. пишу, но с COM так и не разобрался до конца).

Может в этом собака?
Я не до конца ситуацию понял - как ты создаешь и используешь ADO. Но вроде надо быть крайне осторожным.

Вот статейка про STA и MTA (я пока сам не врубился): https://rsdn.org/?article/com/apartmnt.xml
Да и вообще масса материала по запросу "ADO multi threaded". Опять же - сам пока не понял, но вроде как мысль моя правильная - просто так вот взять и работать с ADO из разных потоков как бы нельзя, ну или надо хорошо подумать.
13 июл 19, 15:03    [21926159]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Dimitry Timokhov,
добрый день.

По моим наблюдениям, что с CoInitialize(nil) , что без - разницы никакой. Возможно, срабатывает в моем случае то, что ciMultiThreaded в ServerController включено.

Создаю сначала коннект, потом запрос, самым обычным образом .create(self), (создаю внутри обработчика IWServerControllerBaseBeforeDispatch, в Intraweb, этот обработчик, по идее, всегда сам стартует новый поток, на поступивший запрос от браузера) присваиваю строку подключения и работаю с ними, потом уничтожаю.

Надежности никакой. После примерно 10000 записей точно отвалиться, но чаще отваливается примерно после 1500 вставок. Но надо признать, что память потребляемая приложением с ADO практически не растет.


Сделал сейчас то же на Zeos. Пока - ни одного вылета, вставил 20 000 строк потом пока прервал. Но приложение с 10 мб при старте стало занимать около 120 мб. Получается, ZQuery.Close; ZQuery.Free и ZConnection.Connected:=False; ZConnection.Free;
недостаточно? В порядке бреда делаю еще ZQuery.EmptyDataSet;, но это похоже никак не помогает. Напомню, все остальное в обработчике не менялось, только способ доступа к БД. С ADO память доходила мегабайт до 20 и дальше практически не росла.
13 июл 19, 18:45    [21926195]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6467
Может быть с ADO память нужно считать как сумму потребления нескльких процессов ...
13 июл 19, 19:09    [21926203]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Да, может что и несколько, конечно. Но куда Zeos есть память - не понятно.
13 июл 19, 19:17    [21926205]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6467
Кстати, вы используете FastMM4?
13 июл 19, 21:26    [21926248]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6467
.... просто, возможно с ним меньше получится
13 июл 19, 21:29    [21926251]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Нет, FastMM4 не пробовал. Просто Delphi 2006 "из коробки"

Да, про Zeos. 25 000 встаовк в таблицу и никаких признаков умирания. Но в памяти - около 250 мб!

Вот отчет при закрытии приложения:

К сообщению приложен файл. Размер - 20Kb
13 июл 19, 21:42    [21926257]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Да, еще наблюдение - память, похоже, уходит в ZQuery. Оставил в обработчике только создание/подключение/отключение/уничтожение ZConnection - память не теряется.
13 июл 19, 22:02    [21926262]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3260
AleksVoronezh,
память в наборах не теряется, а расходуется. что бы не расходовалась, не стоит в наборах держать много записей
14 июл 19, 09:10    [21926340]     Ответить | Цитировать Сообщить модератору
 Re: Опять сбоит ADO в Intraweb с ciMultiThreaded  [new]
AleksVoronezh
Member

Откуда:
Сообщений: 316
Не совсем понимаю, зачем держать наборы после того, как я уничтожаю ZQuery. Да и выбираю я каждый раз не более 10 строк из таблицы без BLOB. Откуда такой расход?

Да, оставил тестовую систему работать на ночь. Сейчас в таблице более 80 000 строк и продолжает работать.
Приложение в памяти (по диспетчеру задач) стало занимать с 10 мб при запуске 903 мб теперь !!!

Но пока работает.
14 июл 19, 11:41    [21926355]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить