Delphi Indy 10 HTTPServer привязывает экземпляр базы данных к сеансу - PullRequest
1 голос
/ 27 февраля 2020

Рекомендуется ли привязывать экземпляры подключения к базе данных к сеансам INDY HTTP Server?

Я храню обычные данные сеанса в ARequestInfo.Session.Content.Values, но это только для строк. Мой текущий подход к объектам базы данных (TDatabase это просто пример класса):

  • Создание TDictionary<String,TDatabase>.
  • Создание TDatabase экземпляров для каждого сеанса и сохранение ссылок вместе с идентификатором сеанса в словаре.
  • Доступ к словарю, заключенному в критических разделах обработки сеанса, для обеспечения безопасности потока.
  • Уничтожение TDatabase случаев, когда сеансы уничтожаются.

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

1 Ответ

2 голосов
/ 28 февраля 2020

Свойство Session.Content представляет собой TStrings, которое может содержать строки и указатели TObject. Вам не нужен отдельный TDictionary для сопоставления строк с объектами, вы можете хранить их вместе в самом Content.

В качестве альтернативы, вы можете получить новый класс из TIdHTTPSession, добавить свою базу данных соединение с этим классом, а затем используйте событие TIdHTTPServer.OnCreateSession для создания экземпляров этого класса. Затем, чтобы получить доступ к соединению с базой данных, просто введите любой объект TIdHTTPSession в тип вашего класса.

...