Kenneth
-
Posts
156 -
Joined
-
Last visited
Content Type
Profiles
Forums
Events
Posts posted by Kenneth
-
-
-
А что ему мешает не работать? FireDac работает, FibPlus работает, так почему бы UniDacу не рабоать?
DevArt UniAlerter - это не VCL, это один из компонентов для работы с базами данных. Если слышали что-нибудь про линейку компонентов FireDac, которая присутствует в комплекте с IDE дельфи, то это такой же аналог. В FireDac есть TFDEventsAlerter, так вот он работает с UniGui, но uniAlerter не реагирует. Хотя если делаю все тоже самое в обычном десктопном приложении он отзывается.
Я не претендую на то чтобы разработчики UniGui занимались этим вопросом, но тем не менее, может кто то сталкивался с таким и мог бы подсказать, что не так с этим Алертом?
-
Уважаемый @x11 вы только заголовки читаете? Что значит ничего общего не имеет? Все что нужно я написал в вопросе и думаю там все понятно описано о моей проблеме.
-
Всем привет!
Может кто сталкивался. Решил использовать UniDac вместо FireDac, вроде все хорошо работает, но единственное, не работает UniAlerter, вроде ивентсы указал, авторегистер = тру, посылаю сообщение, тишина. И главное на десктопном приложении все работает как надо, а вот в uniGui не хочет.
И еще после закрытия сервера выводит ошибку
Видать все таки приходят сообщения, но не обрабатываются. Если сообщений не посылать, то этой ошибки нет.
P.S. Сервер Firebird 3.0
-
22 minutes ago, Wicket said:
for UniContainerPanel1: Layout:=vbox, LayoutAttribs: Aling:=Center, Pack:=start;
-
Все вопрос снят. Пока писал ответ, меня осенило
Параметр ServerLimits.MaxSession:=1000, был выставлен на целевом сервере, который я тестил, а в промежуточном клиенте стояло 250! Вот он то выводил исключение.
Всем спасибо за советы!
-
Сервер конечно! А чего не понятного, я же все подробно описал, что я через клиента гружу сервер, в этом и заключается тест. Основная нагрузка на сервер идет, т.к. он за минуту обрабатывает 250 сессий в которых работает с базой!
Я писал что напрямую через СтрессТул не получиться тестить, поэтому я создал клиента, которого грузит СтрессТул, а тот в свою очередь сервер. Надеюсь понятна мысль?
StressTool -> Client -> Web Server.
-
2 hours ago, stas said:
1) Handled в
код не до конца скопировал, две последние строчки оставил:
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 спасибо, очень жду!
UniGUI + UniAlerter(UniDac)
in Russian
Posted
@zilav спасибо. Но почему так сложно, это по сути придется дополнительный сервис поднимать ради этого, ведь сам компонент уже предполагает в себе все эти функции. Все это конечно можно сделать, но как то усложняет систему, тогда мне было бы проще взять тот же компонент с FIBов или FireDac и уже его прикрутить. У них то это все работает. Хотя не проверял на сколько стабильно, может действительно где то в недрах есть проблемы. Но в любом случае, неужели нет возможности использовать стандартный компонент(UniAlerter)?
Хотелось бы услышать мнение насколько это оправдано создавать для этого отдельный сервис, а не возиться с настройками UniAlerter или ему подобных компонентов?