Использование 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:
Работая с потоками и, следовательно, заботясь о безопасности потоков, вы всегда должны следить за целями.
База данных
Многопользовательские базы данных являются потокобезопасными, SingleUser не
Компонент доступа к базе данных
Некоторые из них являются потокобезопасными, некоторые нет. Если вы не знаете, относитесь к ним как к поточным
В вашем случае (надеюсь, у вас есть многопользовательская база данных) безопасно использовать экземпляр соединения / запроса для каждого потока.
Если вы хотите ускорить свое приложение, используйте ObjectPool для подключения и запросов.
Для целей тестирования вы можете создать небольшой клиент, который выполняет много запросов в цикле и запускать несколько экземпляров этого клиента.