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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.02.2007, 18:58   #1  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Кэширование курсов валют
А сталкивался ли кто-нибудь с такой ситуацией в трехуровневой аксе, когда с одной машины поменяли курс валюты, а с других еще пару часов народ формировал документы по старому курсу?

Механизм кэширования курсов валют реализован в аксе достаточно оригинально. Все курсы при удобном случае выбираются в мэп в ClassFactory и в дальнейшем берутся уже оттуда. Не уловил каким образом, но все-таки через пару часиков и на других машинах становится заметно, что курс поменялся. Зачем так, а?
__________________
С уважением,
Tony Green
За это сообщение автора поблагодарили: gl00mie (3).
Старый 08.02.2007, 19:06   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Если вы меняете курс в форме Currency, то автоматически из метода write() вызывается ExchRates::exchRateCache(true) => flush.

А вот если вы курсы откуда-нибудь импортируете, то надо самостоятельно позаботится об очищении кеша.
Старый 08.02.2007, 19:10   #3  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
вызываться-то он вызывается. и мужественно отрабатывает очищая кэш. Только это не настоящий аксаптовский кэш, а кэш в переменной класса ClassFactory. А у каждого пользователя свой экземпляр этого класса. Вот и получается, что у них курс еще какое-то время старый. Или я ошибаюсь?
__________________
С уважением,
Tony Green
Старый 08.02.2007, 19:16   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Да, вы правы. Коллизия не исключена, поскольку ClassFactory существует в двух "ипостасях": на клиенте и на сервере. flush... очищает кэш на сервере и текущем клиенте. Прослеживая цепочку вызовов, можно видеть что методы Currency::amountCur2MST() -> Currency::exchRate() -> ExchRates::exchRateCache() все объявлены как "Called from". Т.е. описанная вами ситуация вполне может возникнуть, если второй клиент успел запомнить в кеше старое значение и запускает некую функцию, которая работает не на сервере. Баг. Пишите авторам.
Старый 08.02.2007, 19:29   #5  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
спасибо за поддержку. дополню:
дело даже не в том, что второй клиент успел запомнить в кэше на клиенте старый курс, а в том, что методы ExchRates::flushCacheServer() и ExchRates::flushCacheClient() очищают переменную класса ClassFactory только ПЕРВОГО клиента, где и была произведена смена курса
В свете этого уже не важно, на клиенте или на сервере выполняется функциональность второго клиента - он так и останется со старым курсом.

Опять же: поправьте меня, если я заблуждаюсь.
__________________
С уважением,
Tony Green
Старый 08.02.2007, 20:00   #6  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Коллизии лезут пачками, когда спохватившись курсы заводят в обед, а вечером разносят заведенные утром журналы. Когда достало, отключили это кэширование нафик. Какого-либо заметного влияния на производительность не наблюдалось.
Проекта под рукой к сожалению нет
__________________
-ТСЯ или -ТЬСЯ ?
Старый 08.02.2007, 22:49   #7  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Стареешь...

static client server ExchRateCache exchRateCache(boolean reSelect = false)
{
// GLIBS, Disabling exchange rates cache -->
return classFactory.exchRateCache(true);
// return classFactory.exchRateCache(reSelect);
// GLIBS, Disabling exchange rates cache <--
}

Это в табличке ExchRates.

Только в табличке ExchRates имеет смысл после этого смастерить уникальный индекс (primary key). Например, из CurCodeDateIdx его сделать. Чтобы кэширование стандартное (которое на уровне таблицы) работало.
__________________
С уважением,
glibs®
Старый 09.02.2007, 09:01   #8  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от glibs Посмотреть сообщение
Стареешь...
Ясно, что не молодею
Просто _reselect - первое, что было сделано (quick & dirty)
Но этим дело не ограничилось, так как сбрасывать кэш при каждом обращении к нему как-то неэстетично
Или по крайней мере сейчас, когда есть время подумать, не ограничился бы
__________________
-ТСЯ или -ТЬСЯ ?
За это сообщение автора поблагодарили: konopello (1).
Старый 09.02.2007, 10:02   #9  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Вопрос философский. Ты ведешь речь о переделке движка по работе с курсами. По идее — это правильное с технической т.з. решение. Но я иногда предпочитаю сделать менее технически правильное, но зато (грубо говоря) проще переносимое на новые СП. Принятие решения о том или ином способе решения проблемы зависит от "цены вопроса" (т.е. если производительность возрастет в 2 раза — это одно, если на 2% — другое). Хотя, м.б. там не сложно и так как ты говоришь переделывать — но опять же "цена вопроса". Я привык экономить деньги клиента (без особой надобности лишнего не делать).

Раз уж продолжили, то я поправлюсь. Вчера на глаза попалась дока... Для курсов валют придется поставить кэширование EntireTable. Синхронизация кэша с интервалом в 60 сек. работает только для этого режима кэширования (в доке так написано).
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: konopello (1).
Теги
кэширование, курс

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Загрузка валют с сайта ЦБ natterru DAX: Администрирование 31 17.11.2020 07:29
Загрузка курсов валют Alenka DAX: Функционал 5 20.01.2009 11:50
Закачка курсов валют с Интернета. Hans DAX: Программирование 1 22.09.2006 12:08
Как попороть автоматическое кэширование PriceDiscTable? NEO DAX: Функционал 2 27.01.2004 14:13
Валюты и курсы валют Rafael DAX: Функционал 1 13.02.2002 19:19
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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