Стратегия повторного использования созданных DB_SERVICES и других экземпляров в EWF_APP потоком

#eiffel #eiffel-studio-20.05 #eiffel-web-framework

#eiffel #eiffel-studio-20.05 #eiffel-веб-фреймворк

Вопрос:

В моем EWF_APP[EWF_APP_EXECUTION] EWF_APP_EXECUTION случае наследуется от WSF_FILTERED_ROUTED_EXECUTION определения setup_router .

Чтобы иметь возможность глобального доступа к информации по потоку (насколько я понимаю, в данном случае реализация также охватывает область), я определил a {MY_APPLICATION_ENVIRONMENT}.app_instance , который является once (по умолчанию thread). app_instance Это handlers: LINKED_LIST[MY_HANDLER] также один раз, и благодаря этому механизму я могу получить доступ к экземпляру обработчика, чтобы получить некоторый полиморфный item_prototype, который я повторно использую в своем бизнесе.

Я также выполняю тот же механизм, db_services: LINKED_LIST[DB_SERVICE[DB_ENTITY]] чтобы иметь возможность получать a DB_SERVICE из его DB_ENTITY имени.

С помощью вышеупомянутого механизма до сих пор только в {EWF_APP_EXECUTION}.setup_router I я создаю службы db, обработчики и расширяю поток app_instance .

Я выяснил, что при setup_router вызове каждого запроса мои обработчики и коллекции {MY_APPLICATION_ENVIRONMENT}.app_instance db_services бесконечно увеличиваются, вызывая утечки памяти.

Какова была бы лучшая стратегия в этом случае? выполнимо ли это в этом контексте, поскольку router , похоже, он воссоздается при каждом запросе на настройку маршрутизатора с существующими обработчиками?

Надеюсь, я достаточно ясно объяснил…

Ответ №1:

Дизайн EiffelWeb основан на WSF_EXECUTION с заданными WSF_REQUEST и WSF_RESPONSE. Интерфейсы очень ограничены, поэтому поверх них можно построить любое расширение фреймворка. Класс WSF_ROUTED_EXECUTION основан на этом интерфейсе и «добавляет» средство маршрутизации. Проверьте код, и вы поймете, как это реализовано. См. WSF_ROUTED_EXECUTION.initialize, а затем WSF_ROUTED_EXECUTION.execute . FILTERED_ROUTED_EXECUTION добавляет понятие фильтров, но это всего лишь расширение, поэтому «маршрутизируемый» дизайн напоминает то же самое.