05.09.2013, 21:11 | #1 |
Читатель
|
Долгий запуск AX2012 R2
Мгновенный старт приложения новейшей версии любимой ERP поражает воображение у всех, кто когда-либо был этому свидетелем. В процессе выяснения причин, почему же так долго, наткнулся на такую вещь - при запуске клиента идут множественные вызовы метода Global\isRunningMode, и каждый вызов тянется несколько секунд. Стек вызова выглядит подобным образом
X++: \Classes\SysModelStore\isInstallMode \Classes\SysCheckList_SetupPartition\isSetupMode \Classes\Application\isRunningMode \Classes\Global\isRunningMode И есть у меня обоснованное подозрение, что именно ее вызов отнимает порой час-другой моего рабочего дня. Кто-нибудь что-нибудь знает об этой процедуре? И еще вопрос - есть ли у кого предположения, почему isRunningMode не кэшируется? Последний раз редактировалось b_nosoff; 05.09.2013 в 21:23. Причина: вопрос на засыпку |
|
|
За это сообщение автора поблагодарили: Logger (3). |
05.09.2013, 22:02 | #2 |
Участник
|
Я думаю, кэширование не приделали, чтобы не морочиться с работоспособностью SysCheckList_SetupPartition в момент, когда все шаги по контрольному списку выполнены, и установку можно считать завершенной (т.е. надо переключиться в RunningMode). Собственно, ничто не мешает сделать кэширование избирательным: если RunningMode - кэшировать, а если SetupMode - не кэшировать. Ведь маловероятно, что система вдруг в процессе работы клиента перейдёт обратно в SetupMode.
|
|
|
За это сообщение автора поблагодарили: b_nosoff (1). |
05.09.2013, 22:39 | #3 |
Administrator
|
А вот я смотрю в метод isRunningMode() на Global и там у меня такой код:
X++: client server static boolean isRunningMode() { SysGlobalCache cache = classfactory.globalCache(); boolean mode; if (cache.isSet(classStr(Global), funcName())) return cache.get(classStr(Global), funcName()); if (! appl) { return false; } mode = appl.isRunningMode(); cache.set(classStr(Global), funcName(), mode); return mode; } Версия ядра и приложения 6.2.1000.1437
__________________
Возможно сделать все. Вопрос времени |
|
05.09.2013, 23:17 | #4 |
Читатель
|
Цитата:
UPD: с селективным кэшем клиент запускается менее чем за 10 секунд, AOS менее чем за 3 минуты X++: boolean isRunningMode() { // fix --> SysGlobalCache cache; ; cache = this.globalCache(); if (cache && cache.isSet(classStr(Application), funcName()) && cache.get(classStr(Application), funcName())) { return true; } // fix <-- /* original code goes here */ // fix --> if (cache) { cache.set(classStr(Application), funcName(), true); } // fix <-- return true; } Последний раз редактировалось b_nosoff; 06.09.2013 в 00:14. Причина: Замечание sukhanchik-а |
|
|
За это сообщение автора поблагодарили: mazzy (2), trud (3), sukhanchik (5), Logger (3), SRF (5). |
05.09.2013, 23:42 | #5 |
Administrator
|
Спасибо за интересное наблюдение. Действительно - ускорение налицо (особенно разработческой части). Единственное - что я думаю - что можно использовать globalCache прямо из класса Application, а не обращаться к classFactory. В классе Global я думаю такое обращение сделано для того, чтобы кеширование было на клиенте (переменная classFactory - клиентская), хотя в конкретно этом случае вполне можно делать кеширование на уровне аоса, а не клиента конкретного пользователя
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: b_nosoff (3). |
06.09.2013, 09:47 | #6 |
Участник
|
Справедливости ради надо отметить, что classFactory - не клиентская переменная. Сугубо клиентский кэш - это info.globalCache(), а объектов classFactory в каждой сессии существует два: клиентский и серверный, с одинаковыми названиями Использование classFactory.globalCache() позволяет использовать всегда "локальный" кэш независимо от того, где работает вызывающий код. Правда, разумеется, физически кэшей в таком случае получается два.
|
|
06.09.2013, 13:28 | #7 |
Читатель
|
Наблюдения показали, что axutil.RetrieveInstallModeState() не всегда долго работает. От чего это зависит, пока понять не удалось.
В общем, окончательный вариант - реализовать кэширование непосредственно в SysModelStore.isInstallMode(), так как нашлось еще куча разных путей его вызова. Ну и для надежности еще сделать этот кэш с таймаутом, т.е. сохранять в кэш время, на пять минут большее, чем сейчас, и потом сравнивать полученное из кэша значение с текущим временем, на случай, если вдруг в процессе работы была залита модель. |
|
Теги |
ax2012, isrunningmode, xu_getdirtyflag, долгий запуск клиента |
|
|