|
|
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Добрый день. Помогите, пожалуйста. Мне нужно в оконном приложении с встроенным 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.07.2019, 12:53 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Да, перед CoUninitialize сначала ADOQuery, потом ADOConnection уничтожаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2019, 12:57 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Еще странность - если в потоке обработки оставить только создание ADO-соединения и его уничтожение в конце, то все работает. Стоит в середину вставить создание ADO-запроса и производить выборку с двух клиентов, всего десяти первых строк из таблицы, в которую никто не пишет (в таблице есть около 1000 строк) то часа через пол опять возникает ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 10:11 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
может обдумать идею пула соединений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 12:57 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
... хотя, судя по этому посту , я был не прав с пулом соединений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 13:58 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Есть опасение, что свой велосипед будет еще хуже. Мне кажется, что если я при динамическом соpздании коннекта ADO не указал какой-то там параметр, не помню его имя, с значением (-2), то ADO создает свой пул. Кроме того, еще и в ODBC есть свой встроенный пул, в диспетчере. Типа Micrisoft о нас позаботился :-) Пул ODBC пробовал включать - без толу. Кроме того, проблема, похоже, проявляется при вступлении в дело Query, коннекты-то создаются и уничтожаются без зависаний. Хотя это очень умозрительно конечно, после выполнения запроса и коннеект уже далеко не в том программном состоянии, что при ожидании. Можно конечно попробовать другую базу, с нативным OLE DB провайдером, но это практически один MSSql. Как его потом прикручивать на хостинг к PHP... нет, это не вариант. Как-то ведь люди кладут в базу данные по запросам, поступающим на Indy серверы, Intraweb это почти тоже самое. Правильно я понимаю, что при каждом запросе в IWServerControllerBaseBeforeDispatch создается независимый поток, в котором можно создать объекты доступа к данным, выполнить чтение/запись и уничтожить объекты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 14:08 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Отключил встроенный в OLE DB пул. Скорость упала не критично. Кажется, стало стабильнее. Пул в ODBC тоже пока отключен. Пока не падает на записи. Но это не точно. Как думаете, может есть смысл поменять что-то еще в строке подключения? Курсор по умолчанию, серверный надо полагать. Сделать без курсора? Клиентский надо думать не вариант точно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 19:26 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Нет. Опять облом на 3291 записи. Придется, видимо, процедурно, в Delphi, проверять при каждой вставке, что запись корректно попала в базу. Вот обломно-то.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2019, 19:32 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
А вообще, проблема в моем случае может быть глобально MDAC (ADO, OLEDEB) да и конкретный ODBC-драйвер для MySQL не стоит списывать. Посоветуйте, пожалуйста, какие-либо бесплатные компоненты доступа к MySQL для Delphi? Чтоб уж попробовать подключаться и работать с базой через другую технологию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 08:07 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh, Может стоит саму СУБД поменять? Тогда и с компонентами, даже штатными, будет попроще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 10:10 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
AleksVoronezhПосоветуйте, пожалуйста, какие-либо бесплатные компоненты доступа к MySQL для Delphi? Чтоб уж попробовать подключаться и работать с базой через другую технологию. Ну если для "попробовать" то Zeos вроде поддерживает MySQL. Правда сам я ею не пользовался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 11:13 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh, У меня есть положительный опыт с SciBit MyComponents VCL Suite , но их сайта что то больше нет www.scibit.com :( Жалко, прекрасные компоненты. В интернете они до сих пор находятся. но не знаю, законно ли их использовать ... Так же часто на форумах проскакивала библиотека ZeosLib , но я сам опыта не имел с ней, так что не скажу. И смотрите на лицензию, чтобы на GPL не наткнуться. Как здесь, например: MySQL direct (смотрите, там можно скачать юниты DirectMysqlObject.zip и демку DemoObjectsWin.zip или перейти на сайт проекта на sourceforge ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 11:24 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh, Zeos ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 11:25 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Спасибо, к Zeos обязательно присмотрюсь. Пока же снес MySQL 8.0 (64bit) и ODBC драйвер (32bit) из его же инсталлятора. Поставил MySQL 5.7.26 (32 bit) и ODBC из его же инсталлятора. На сейчас вставлено 12700 записей и полет нормальный. Но вся эта ситуация очень странная, очень. Нужно будет еще попробовать пописать в MySQL 5.7.26 (64 bit), кто знает, что будет у провайдера например.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 23:41 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
>> И смотрите на лицензию, чтобы на GPL не наткнуться. Поясните, пожалуйста. Правильно я понимаю, что MySQL Community можно без ограничений использовать в коммерческих проектах в том числе, а клиентские DLL от MySQL, которые использует Zeos, налагают какие-то ограничения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 10:50 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh, Не далее как недавно тоже озаботился использования ADO в многопоточном режиме. Сам пока не разобрался. Но понял одно: CoInitialize(nil) - создает single threaded appartment (только не спрашивай что это - 20+ проф. пишу, но с COM так и не разобрался до конца). Может в этом собака? Я не до конца ситуацию понял - как ты создаешь и используешь ADO. Но вроде надо быть крайне осторожным. Вот статейка про STA и MTA (я пока сам не врубился): https://rsdn.org/?article/com/apartmnt.xml Да и вообще масса материала по запросу "ADO multi threaded". Опять же - сам пока не понял, но вроде как мысль моя правильная - просто так вот взять и работать с ADO из разных потоков как бы нельзя, ну или надо хорошо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 15:03 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
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.07.2019, 18:45 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Может быть с ADO память нужно считать как сумму потребления нескльких процессов ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 19:09 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Да, может что и несколько, конечно. Но куда Zeos есть память - не понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 19:17 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Кстати, вы используете FastMM4? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 21:26 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
.... просто, возможно с ним меньше получится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 21:29 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Нет, FastMM4 не пробовал. Просто Delphi 2006 "из коробки" Да, про Zeos. 25 000 встаовк в таблицу и никаких признаков умирания. Но в памяти - около 250 мб! Вот отчет при закрытии приложения: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 21:42 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Да, еще наблюдение - память, похоже, уходит в ZQuery. Оставил в обработчике только создание/подключение/отключение/уничтожение ZConnection - память не теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 22:02 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
AleksVoronezh, память в наборах не теряется, а расходуется. что бы не расходовалась, не стоит в наборах держать много записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2019, 09:10 |
|
||
|
Опять сбоит ADO в Intraweb с ciMultiThreaded
|
|||
|---|---|---|---|
|
#18+
Не совсем понимаю, зачем держать наборы после того, как я уничтожаю ZQuery. Да и выбираю я каждый раз не более 10 строк из таблицы без BLOB. Откуда такой расход? Да, оставил тестовую систему работать на ночь. Сейчас в таблице более 80 000 строк и продолжает работать. Приложение в памяти (по диспетчеру задач) стало занимать с 10 мб при запуске 903 мб теперь !!! Но пока работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2019, 11:41 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=68&tid=2039252]: |
0ms |
get settings: |
5ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 405ms |

| 0 / 0 |
