Использование TidHTTPServer для обслуживания GET-запроса безопасным способом

У меня есть класс со многими службами, которые в основном вызывают соединения с базой данных (DBISAM или через ZEOS).

Я делаю этот класс доступным в веб-сервисе, например, используя TidHTTPServer. Я использую событие OnCommandGet из него и использую ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo для выполнения запросов и результатов.

Я создал TObjectList для хранения экземпляра каждого клиента, связанного с этим классом обслуживания. Соединение с базой данных создается и освобождается для каждого выполненного вызова в надежде избежать проблем с потоками.

Я хочу знать, если это правильный путь. Я не использую сессию с TidHTTPServer. После каждого запроса на обслуживание я нахожу объект в списке TObjectList, в котором хранится информация, связанная с этим соединением.

Я просмотрел вопросы, но не получил всю необходимую информацию.

Однако я не уверен в безопасности, особенно когда много звонков могут происходить одновременно. Я использую его регулярно, в основном, по 1 звонку за раз, так как сложно тестировать со многими соединениями одновременно.

Я хочу знать, является ли это правильным подходом, или если нет, как я могу реализовать "мост" для безопасного вызова моего класса (я создал QueryActivity для этого класса, имитируя стиль запроса COM), передавая запрос и возвращая параметры,

Delphi XE2 - Indy 10.5.8

2 ответа

Решение

Индийские классы TCP-сервера (например, tTIdHTTPServer) имеют возможность назначить класс контекста приложения. Этот класс содержит специфичную для соединения информацию о клиенте и может быть расширена с помощью пользовательских свойств для переноса специфичной для вашего приложения информации. Для этого создайте подкласс из TIdServerContext и назначьте класс для ContextClass сервера.

Если соединение поддерживается между запросами (что рекомендуется для экономии ресурсов), этот контекст сохранит информацию о клиенте приложения в течение всего срока его службы.

Indy также позволяет перебирать список всех подключенных контекстов подключения, например, для поддержки широковещательных сообщений или для сбора информации.

Примеры на Stackru:

Как отследить количество клиентов с Indy TIdTCPServer

TCP-сервер Indy 10

Как отправить команду одному клиенту вместо всех?

Работая с потоками и, следовательно, заботясь о безопасности потоков, вы всегда должны следить за целями.

База данных

Многопользовательские базы данных являются потокобезопасными, SingleUser не

Компонент доступа к базе данных

Некоторые из них являются потокобезопасными, некоторые нет. Если вы не знаете, относитесь к ним как к поточным


В вашем случае (надеюсь, у вас есть многопользовательская база данных) безопасно использовать экземпляр соединения / запроса для каждого потока.

Если вы хотите ускорить свое приложение, используйте ObjectPool для подключения и запросов.

Для целей тестирования вы можете создать небольшой клиент, который выполняет много запросов в цикле и запускать несколько экземпляров этого клиента.

Другие вопросы по тегам