AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.04.2011, 12:15   #1  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Несколько AOS: синхронность изменения объектов
Всем привет.
Мы используем 2 AOSа привязанных к одному приложению, в связи с чем появилась проблема при ведении разработок.
Пример такой: на AOS №1 я меняю название у поля таблички, после чего захожу на AOS №2 и очень долго не вижу изменений (в репозитарии поле таблички имеет старое имя).

Выход из ситуации найден один единственный:
1. сначала запуск на стороне сервера (директива server в вызывающем методе):
sysFlushDictionary::doFlush() // обновление словаря
2. затем на стороне клиента (директива client в вызывающем методе) запуск следующих команд:
xSession::removeAOC(); // чистим клиентский кеш
sysTreeNode::refreshAll(); // обновляем тринод
sysFlushDictionary::doFlush(); // обновление словаря
sysFlushAOD::doFlush(); // обновление АОД
xSession::updateAOC(); // обновляем клиентский кеш

3. восстанавление объекта (км таблички - Восстановить)

Единственное ли это верное решение для данной проблемы? AOSы не объединены в кластер. Решит ли данную проблему объединение AOSов в кластер?
Ну и собственно не могли бы знающие люди пролить свет на нюансы кеширования, которые полезно было б знать.
Спасибо

Последний раз редактировалось Андрей К.; 12.04.2011 в 12:28.
Старый 12.04.2011, 13:02   #2  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Ответ нашелся в стандарте разработки <стыд>:

Цитата:
1.8. В случае, когда для работы с приложением создано два экземпляра АОС, при завершении разработки необходимо обновить кэш на обоих экземплярах АОС, запустив следующие операции:
o «Сервис / Средства разработки / Объекты приложения / Обновление словаря»
o «Сервис / Средства разработки / Объекты приложения / Обновление данных»
в случае с изменением названия поля таблички, нужно не забывать синхронизировать её сразу после изменения (что я забывал делать). затем на втором аосе после сбрасывания кеша нужно синхронизировать эту же таблицу с скл и новое название поля подтянется напрямую из бд

Последний раз редактировалось Андрей К.; 12.04.2011 в 13:20.
Старый 12.04.2011, 13:04   #3  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Извиняюсь за глупый вопрос - а для чего вести разработку на 2-х АОС-ах? У вас более 60 одновременно работающих разработчиков?
Старый 12.04.2011, 13:16   #4  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от kornix Посмотреть сообщение
Извиняюсь за глупый вопрос - а для чего вести разработку на 2-х АОС-ах? У вас более 60 одновременно работающих разработчиков?
у нас - нет
у клиента есть жалобы, что когда пакеты изменений ставятся на АОС1 , то АОС2 не видит новые изменения - ну ясное дело, он видит только свой кеш

интересно а как часто этот кеш автоматически обновляется?

Последний раз редактировалось Андрей К.; 12.04.2011 в 13:18.
Старый 12.04.2011, 13:41   #5  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
А.. Тогда как вариант можно заливать на один AOS, делать на нем инкрементную компилляцию, а ночью перезапускать АОС'ы
Старый 12.04.2011, 14:04   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Насколько я помню для таблиц Обновление словаря и Обновление данных не всегда помогает. Но зато помогает компиляция, восстановление и повторная компиляция.
Старый 12.04.2011, 14:16   #7  
Андрей К. is offline
Андрей К.
Постигающий
 
152 / 10 (1) +
Регистрация: 09.04.2007
Цитата:
Сообщение от Logger Посмотреть сообщение
Насколько я помню для таблиц Обновление словаря и Обновление данных не всегда помогает. Но зато помогает компиляция, восстановление и повторная компиляция.
вот в случае с таблицами синхронизацию надо применять
Старый 12.04.2011, 17:36   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
вот в случае с таблицами синхронизацию надо применять
не помогает.
На других аосах видны Unknown поля. Нужно на каждом аосе компильнуть и восстановить соответствующую табличку, чтобы кеш сбросился.
Старый 11.05.2011, 23:55   #9  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Не знаю, работает ли это на практике, но судя по всему, нужно сразу после накатывания модификаций, через меню сервис последовательно вызвать
1. Средства разработки\объекты приложения\обновить АОD
2. -\\- обновить словарь
3. -\\- обновить данные

В каждом из этих случаев "взводится" соответствующая команда всем АОСам через вызов SysEvent::fireEvent(SysEventType::XXXXXX), где XXXXXX = [FlushAOD | FlushData | FlushDictionary | ...]); Команда помещается в таблицку табличку SysEvent.

Каждый из АОСов в отдельном потоке потоянно "слушает" эту таблицу и при появлении в ней команды исполняет её посредством класса "SysEventHandler", который инициализируется на стартапе АОСа. Таким образом, проблема сброса кэша и подтягивания изменений должна решаться для АОСов.Ну а клиентам придется перезайти в систему, хотя, можно подумать в сторону простейшего допила этой функции для клиентских сессий. (но, видимо, неспроста функциональность намеренно ограничена только для серверных сессий - см. код)

Этот механизм реализован как минимум в AX2009. Если механизм эффективен, то для старых версий навскидку можно реализовать по аналогии.
Старый 12.05.2011, 01:27   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Андрей К. Посмотреть сообщение
вот в случае с таблицами синхронизацию надо применять
О, да! Вспомнилось, как однажды было добавлено поле в одну из тех таблиц, которые синхронизируются при старте сессии. На одном АОСе синхронизировали таблицу после создания поля - оно в базе появилось, на другой АОС зашел пользователь, табличка синхронизировалась - поле из базы пропало, и так ндцать раз... А еще очень "весело" может получиться, если добавить поле в таблицу, которая постоянно используется в приложении (какая-нить SalesParameters): добавили, не успели синхронизироваться, зашел пользователь, "увидел", что в таблице новое поле, давай его указывать в select'ах, а СУБД грит, отвали, нету такого поля в таблице - и так у пользователя на любой чих начинает лезть ошибка, и ничего не работает.
Это я все к тому, что на рабочей базе при нескольких работающих АОСах и работающих пользователях схему данных лучше не менять - вообще. Ну либо очень хорошо взвешивать все "за" и "против".
Цитата:
Сообщение от DSPIC Посмотреть сообщение
В каждом из этих случаев "взводится" соответствующая команда всем АОСам через вызов SysEvent::fireEvent(SysEventType::XXXXXX), где XXXXXX = [FlushAOD | FlushData | FlushDictionary | ...]);
К сожалению, это все не поможет обновить кэш объектов приложения на клиентах. Я как-то под отладчиком наблюдал, как мне прежде казалось, совершенно невероятную ситуацию: класс-наследник RunBase переключался между клиентом и сервером, там и там дергая определенный метод (кажется, это был validate), и при этом на клиенте код этого метода был один, а на сервере - другой. Так что кэширование кода на клиентах - штука опасная, и забывать про него нельзя.
Старый 12.05.2011, 10:04   #11  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
мне кажется правильнее, после накатывания модификаций на рабочую базу (особенно изменения таблиц, EDT и пр.), перезапустить все АОСы. так гарантировано все изменения подцепятся, гарантировано все пользователи перезойдут.
Если вдруг после перезапуска АОСов некоторые пользователи все равно не видят изменений (и такое бывает, но редко) то тогда нужно удалить файлы кэша АОСа на машине клиента.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Несколько AOS к одной БД alesander DAX: Администрирование 11 28.09.2010 16:12
daxis: Troubleshooting blocked SPIDS in AOS Blog bot DAX Blogs 0 01.04.2009 18:05
Arijit Basu: AX 4 AOS Basics: [Level 100] Blog bot DAX Blogs 0 18.11.2007 14:30
Вылетает аxапта 4.0 при завершении работы Delfins DAX: Прочие вопросы 5 27.06.2007 15:43
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:35.