|
|
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
Добрый день. На нескольких хостах развернут сервер реализованный через datasnap. На клиенте мне нужно параллельно обращаться к каждому из серверов. Но складывается ощущение что в один момент времени клиент может открыть только одно соединение, и не важно что подключения создаются и осуществляются каждый в своем потоке, потому что как только один из хостов недоступен остальные потоки(TTask) "зависают" и в них просто ничего не происходит пока неработающий хост не прервется по таймауту. Вопрос: действительно ли это так?возможно нужно выставить какой-то параметр у SQLConnection?или такой проблемы вообще нет и видимо ошибка где то в коде? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 15:42 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
Я предполагаю, что Ваш клиент уже в значительной степени написан, там много кода и его сложно использовать для отладки. Это так ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 16:00 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
Sinemurius, да клиент написан, но при отладке я ничего не нахожу. судя по логам второй поток просто не стартует из-за того что в этот момент в другом потоке висит конекшн к другому серверу. в основном потоке примерно: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. таким образом создаются например 2 потока(первым тот у которого хост отключен), task стартует(у второго тоже успевает вызваться метод старт), и потом второй таск просто не запускается как будто, "скажем так пул потоков лочится" пока первый таск не отвиснет. Логи: первый: Код: pascal 1. 2. 3. второй: Код: pascal 1. 2. Если будет пять хостов и неработающий в списке посередине, первые два запускаются, начинают работать а потом просто виснут пока третий(с неработащим хостом) не вывалится с таймаутом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 16:23 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
А не используете Synchronize или что-то в этом роде ? Я обычно в таких случаях трачу минут 40, чтобы написать крайне упрощенный вариант клиента для отладки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:20 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
Sinemurius, нет не использую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2020, 18:23 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
Переписал с использованием TThread вместо TTask такой проблемы нет..причина не понятна ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2020, 14:41 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
Может быть это связано с There's a nasty bug in the System.Threading code that was introduced in Delphi 10.2 Tokyo. I certainly hope that it will be fixed in the next release, as it makes the Parallel Programming Library hard to use. It sometimes causes new threads not to be created when you start a task. That forces your tasks to execute one by one, not in parallel. как это описано у Primož Gabrijelčič в Delphi High Performance ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2020, 15:07 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
AlexeyM123, нет. Нашел причину. Как оказалось потоки не при чем(просто повезло). Зачем-то в технологии datasnap они открывают конекшн в момент его создания: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. где TDBXConnectionFactory - singleton. А выше в DoConnect: Код: pascal 1. 2. 3. 4. 5. 6. не понимаю к чему такая реализация, почему бы не пытаться открывать конекшн отдельно от лока, ведь экземпляр уже создан и на фабрику открытие никак не должно влиять. Буду смотреть дальше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 10:15 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
RuslanSharipov почему бы не пытаться открывать конекшн отдельно от лока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 18:24 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
Если вы используете датаснапом автогенерируемые датамодули, ну или что-то подобное делаете сами, то... Один экземпляр модуля = 1 подключение = 1 поток. Если надо 10 потоков, то придется создавать 10 экземпляров дата модуля/коннекшенов и.т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2020, 19:03 |
|
||
|
Datasnap client
|
|||
|---|---|---|---|
|
#18+
X-Cite, без датамодулей. А так всё верно на каждый поток - свои экземпляры. Проблема именно в реализации создания datasnap connection, и обойти ее нет возможности. Еще и таймаутом подключения нельзя управлять, приходится вначале через TIdTcpClient пробовать открывать коннекшн со своим таймаутом, и если все ок уже переходить к созданию datasnap connection, чтобы избежать длительного лока. Лучше решения не придумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2020, 09:39 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39926574&tid=2038598]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 353ms |

| 0 / 0 |
