Kenneth
uniGUI Subscriber-
Posts
156 -
Joined
-
Last visited
Content Type
Profiles
Forums
Events
Everything posted by Kenneth
-
@zilav спасибо. Но почему так сложно, это по сути придется дополнительный сервис поднимать ради этого, ведь сам компонент уже предполагает в себе все эти функции. Все это конечно можно сделать, но как то усложняет систему, тогда мне было бы проще взять тот же компонент с FIBов или FireDac и уже его прикрутить. У них то это все работает. Хотя не проверял на сколько стабильно, может действительно где то в недрах есть проблемы. Но в любом случае, неужели нет возможности использовать стандартный компонент(UniAlerter)? Хотелось бы услышать мнение насколько это оправдано создавать для этого отдельный сервис, а не возиться с настройками UniAlerter или ему подобных компонентов?
-
@zilav, @stas спасибо вам за советы, не могли бы еще скинуть ссылку на рабочий код работы с вебсокетами? Поиск по форуму не дал результатов У меня тоже стоит задача обновлять датасеты.
-
А что ему мешает не работать? FireDac работает, FibPlus работает, так почему бы UniDacу не рабоать? DevArt UniAlerter - это не VCL, это один из компонентов для работы с базами данных. Если слышали что-нибудь про линейку компонентов FireDac, которая присутствует в комплекте с IDE дельфи, то это такой же аналог. В FireDac есть TFDEventsAlerter, так вот он работает с UniGui, но uniAlerter не реагирует. Хотя если делаю все тоже самое в обычном десктопном приложении он отзывается. Я не претендую на то чтобы разработчики UniGui занимались этим вопросом, но тем не менее, может кто то сталкивался с таким и мог бы подсказать, что не так с этим Алертом?
-
Уважаемый @x11 вы только заголовки читаете? Что значит ничего общего не имеет? Все что нужно я написал в вопросе и думаю там все понятно описано о моей проблеме.
-
Всем привет! Может кто сталкивался. Решил использовать UniDac вместо FireDac, вроде все хорошо работает, но единственное, не работает UniAlerter, вроде ивентсы указал, авторегистер = тру, посылаю сообщение, тишина. И главное на десктопном приложении все работает как надо, а вот в uniGui не хочет. И еще после закрытия сервера выводит ошибку Видать все таки приходят сообщения, но не обрабатываются. Если сообщений не посылать, то этой ошибки нет. P.S. Сервер Firebird 3.0
-
-
Все вопрос снят. Пока писал ответ, меня осенило Параметр ServerLimits.MaxSession:=1000, был выставлен на целевом сервере, который я тестил, а в промежуточном клиенте стояло 250! Вот он то выводил исключение. Всем спасибо за советы!
-
Сервер конечно! А чего не понятного, я же все подробно описал, что я через клиента гружу сервер, в этом и заключается тест. Основная нагрузка на сервер идет, т.к. он за минуту обрабатывает 250 сессий в которых работает с базой! Я писал что напрямую через СтрессТул не получиться тестить, поэтому я создал клиента, которого грузит СтрессТул, а тот в свою очередь сервер. Надеюсь понятна мысль? StressTool -> Client -> Web Server.
-
@stas код не до конца скопировал, две последние строчки оставил: AResponseInfo.ResponseNo:=200; Handled:=true; end; Там все нормально. Теперь на счет тестирования. Согласен напрямую не протестируешь. Поэтому я запустил свой тестовый проект, создал другое приложение, в котором на форме бросил две кнопочки, одна отправляет запрос на мой сервис для вставки записи, другая на селект. Через StressTool запускаю запись сценария, запускается второе приложение, которое обращается к моему целевому, нажимаю последовательно эти две кнопочки, завершаю запись и после прогоняю этот сценарий. При удачном тесте все записи 250 запсей вставляются, что говорит о работе теста. Так что не думаю что СтрессТул неприменим. Вопрос остается, почему не получается увеличить кол-во сессий больше 250?
-
Небольшой отчет о проделанной работе, к чему привели тесты. Не буду описывать что и как я перепробовал, имею ввиду все варианты, а начну сразу с рабочего варианта, то что действительно дало результаты. Создаю в FDManager соединение с пулом, соединения с базой и сами запросы создаю в рантайме, и после уничтажаю их. Что использовал: Firebird 3.0 + FireDac. На серверМодуль кидаю FDManager, в onCreate настраиваю подключение с пулом и делаю актив=тру. Все как доках. И все! Дальше принимаю запрос и делаю следующее: if ARequestInfo.URI = '/test/ins' then //запрос на вставку записи begin Con:=TFDConnection.Create(self); con.ConnectionDefName:='FB_Con_srv'; con.Connected:=true; with TFDCommand.Create(self) do begin Connection:=con; CommandText.Add('insert into tbtest(name) values('''+ARequestInfo.Params.Values['n']+''');'); try Execute; AResponseInfo.ContentText:='ok'; AResponseInfo.ResponseNo:=200; finally free; con.Free; end; end; Handled:=true; end else if ARequestInfo.URI = '/test/get' then //запрос на селект begin Con:=TFDConnection.Create(self); con.ConnectionDefName:='FB_Con_srv'; con.Connected:=true; with TFDQuery.Create(self) do begin Connection:=con; SQL.Add('select count(*) as cnt from tbtest;'); try Active:=true; AResponseInfo.ContentText:='{"cnt":'+FieldByName('CNT').AsString+'}'; Close; finally Free; con.Free; end; end; Тестил через Stress TestTool. В тесте сначала вставляю запись в табилцу, потом следующей сессией выбираю кол-во записей. 250 Сессий отрабатывает на ура, но почему если делать больше, то вылетает с ошибкой. ServerLimits.MaxSession:=1000; Что еще нужно подкрутить?
-
Да буду делать тесты, прежде думал спросить, может кто то сталкивался, чтобы не изобретать велосипед.
-
@stas прошу прощения, я почему то не так прочитал. даже во второй раз. Да все верно вы написали. А если использовать один коннект с пулом и создавать запросы не будет легче?
-
@stas да согласен, что нужно создавать в рантайме, но не МаинМодуль, достаточно думаю коннект или запросы
-
Ого сколько мнений! Спасибо за советы! Что то все ушли в сторону МаинМодуля, но по-моему как то это не верно! Задача то по сути следующая: 1. получать http запросы извне; 2. произвести некие действия с базой; 3. вернуть результат. Вот в принципе и все что надо. МаинМодуль это больше про сессии, которые как бы здесь не особо меня интересуют. Основное опасение, не будут ли мешать запросы друг-другу, так как СерверМодуль один и коннект один. Тут по-моему есть два варианта: 1. создавать динамически коннект, делать свои дела и уничтожать 2. или создать один коннект с пулом и динамически создавать запросы и уничтожать. 3. или еще ваш вариант.... Будет ли это работать так как надо при больших нагрузках? Как себя поведет СерверМодуль если одновременно прилетит один и тот же запрос с 10 адресов? Он выполнит их паралельно или же поставит в очередь или же зависнет? Хотелось бы все таки услышать мнение самих разработчиков или все же смотреть в сторону других решений?
-
http запрос не доходит до MainModule, если знаете как его до туда донести, подскажите. В СерверМодуле есть две прекрасные функции UniGUIServerModuleHTTPCommand и UniGUIServerModuleHTTPDocument, в которых я и принимаю мои запросы, но как до MainModule их донести?
-
грид привязан к датасету? может поля попробовать создать в самом гриде, хотя он должен все показать, если не создавать
-
Так в том то и вопрос, предназначена ли она для этого. Говорю же, увидел поддержку веб сервисов. А так думаю неплохо было бы в самом унигуи иметь такой сервис и уже ничего стороннего не подключать. Сейчас нашел delphimvcframework. Разбираюсь. А кто чем пользуется? Я так понимаю при каждом запросе должен создаваться отдельный поток с подключением, чтобы не мешать друг другу, чего в ServerModule можно добитсья создавая динамически отдельное соединение, но насколько это оправдано в рамках экономии памяти, не раздует ли сервер при множестве запросов? Ну еще можно с пулом соединения поиграться. В общем у кого какой опыт, поделитесь, направьте пожалуйста.
-
Всем привет! Возник такой вопрос, могу ли я использовать UNIGUI как RestFul Api? В ServerModule есть возможность принимать запросы ПОСТ, ГЕТ с параметрами и в принципе технически, я так понял, можно принять запрос с параметрами, обратиться к базе и обратно вернуть JSON ответ. Я все это уже сделал и в принципе все неплохо работает, но возник вопрос! В документации настоятельно не рекомендуют создавать подключение к базе данных в ServerModule, так как это один глобальный ресурс нашего приложения и при многопоточной работе могут возникнуть конфликты, особенно при редактировании данных. Есть конечно вариант занести в критическую зону, но не думаю что это решение для 100 и более подключений. Поэтому, если я один обращаюсь к этому вэб-сервису, то проблем нет, а если сразу будет 100 подключений? Как это решается, ведь не просто так были созданы процедуры обработки http запросов в ServerModule? Или это сделано только для чтения и для особых случаев, но не для организации вэб сервиса? Если все таки можно, то подскажите куда двигаться? Надеюсь понятно изложил мысль?
-
Есть свойство uniDBGrid.WebOptions.Paged:=false; Это чтобы по страницам не клацать. Ну и логично uniDBGrid.WebOptions.FetchAll:=false; На счет того чтобы верхние записи выгружал не могу сказать.
-
@Sherzod Thanks, very good! It's cool!
-
@Sherzod Thanks It work. Actually I need to change TUnimScrollBox position. How can I do it?
-
@Sherzod How to do it for mobile version?
-
@Sherzod Спасибо, все отлично работает!
-
Тоже пробовал, результат такой же. Попробую еще раз. Кстати после добавления страниц PageCount всегда равен 0. Как будто ничего не добавилсь, хотя руками карусель прокручивается, а программно не могу прокурить на нужную страницу.
-
@Sherzod спасибо, очень жду!