powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Опять сбоит ADO в Intraweb с ciMultiThreaded
25 сообщений из 48, страница 1 из 2
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39835923
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

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

Мне нужно в оконном приложении с встроенным 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 записей. Но валиться всегда.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39835924
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, перед CoUninitialize сначала ADOQuery, потом ADOConnection уничтожаются.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836197
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще странность - если в потоке обработки оставить только создание ADO-соединения и его уничтожение в конце, то все работает.

Стоит в середину вставить создание ADO-запроса и производить выборку с двух клиентов, всего десяти первых строк из таблицы, в которую никто не пишет (в таблице есть около 1000 строк) то часа через пол опять возникает ошибка.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836318
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может обдумать идею пула соединений?
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836375
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... хотя, судя по этому посту , я был не прав с пулом соединений
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836380
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть опасение, что свой велосипед будет еще хуже.

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

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

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

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

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

Правильно я понимаю, что при каждом запросе в IWServerControllerBaseBeforeDispatch создается независимый поток, в котором можно создать объекты доступа к данным, выполнить чтение/запись и уничтожить объекты?
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836556
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отключил встроенный в OLE DB пул. Скорость упала не критично.

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


Как думаете, может есть смысл поменять что-то еще в строке подключения? Курсор по умолчанию, серверный надо полагать.
Сделать без курсора? Клиентский надо думать не вариант точно.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836558
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет. Опять облом на 3291 записи. Придется, видимо, процедурно, в Delphi, проверять при каждой вставке, что запись корректно попала в базу. Вот обломно-то....
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836644
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вообще, проблема в моем случае может быть глобально MDAC (ADO, OLEDEB) да и конкретный ODBC-драйвер для MySQL не стоит списывать.

Посоветуйте, пожалуйста, какие-либо бесплатные компоненты доступа к MySQL для Delphi? Чтоб уж попробовать подключаться и работать с базой через другую технологию.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836684
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksVoronezh,

Может стоит саму СУБД поменять? Тогда и с компонентами, даже штатными, будет попроще.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836716
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksVoronezhПосоветуйте, пожалуйста, какие-либо бесплатные компоненты доступа к MySQL для Delphi? Чтоб уж попробовать подключаться и работать с базой через другую технологию.
Ну если для "попробовать" то Zeos вроде поддерживает MySQL. Правда сам я ею не пользовался.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836729
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksVoronezh,


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

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

И смотрите на лицензию, чтобы на GPL не наткнуться. Как здесь, например: MySQL direct (смотрите, там можно скачать юниты DirectMysqlObject.zip и демку DemoObjectsWin.zip или перейти на сайт проекта на sourceforge )
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39836730
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksVoronezh,

Zeos
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837026
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, к Zeos обязательно присмотрюсь.

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


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

Нужно будет еще попробовать пописать в MySQL 5.7.26 (64 bit), кто знает, что будет у провайдера например....
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837060
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>> И смотрите на лицензию, чтобы на GPL не наткнуться.

Поясните, пожалуйста. Правильно я понимаю, что MySQL Community можно без ограничений использовать в коммерческих проектах в том числе, а клиентские DLL от MySQL, которые использует Zeos, налагают какие-то ограничения?
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837092
Dimitry Timokhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AleksVoronezh,

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

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

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

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

Вот статейка про STA и MTA (я пока сам не врубился): https://rsdn.org/?article/com/apartmnt.xml
Да и вообще масса материала по запросу "ADO multi threaded". Опять же - сам пока не понял, но вроде как мысль моя правильная - просто так вот взять и работать с ADO из разных потоков как бы нельзя, ну или надо хорошо подумать.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837112
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 и дальше практически не росла.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837116
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть с ADO память нужно считать как сумму потребления нескльких процессов ...
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837117
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, может что и несколько, конечно. Но куда Zeos есть память - не понятно.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837131
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, вы используете FastMM4?
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837133
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.... просто, возможно с ним меньше получится
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837136
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, FastMM4 не пробовал. Просто Delphi 2006 "из коробки"

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

Вот отчет при закрытии приложения:
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837139
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, еще наблюдение - память, похоже, уходит в ZQuery. Оставил в обработчике только создание/подключение/отключение/уничтожение ZConnection - память не теряется.
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837187
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AleksVoronezh,
память в наборах не теряется, а расходуется. что бы не расходовалась, не стоит в наборах держать много записей
...
Рейтинг: 0 / 0
Опять сбоит ADO в Intraweb с ciMultiThreaded
    #39837199
AleksVoronezh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем понимаю, зачем держать наборы после того, как я уничтожаю ZQuery. Да и выбираю я каждый раз не более 10 строк из таблицы без BLOB. Откуда такой расход?

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

Но пока работает.
...
Рейтинг: 0 / 0
25 сообщений из 48, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Опять сбоит ADO в Intraweb с ciMultiThreaded
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]