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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.04.2007, 18:01   #1  
Blog bot is offline
Blog bot
Участник
 
25,640 / 848 (80) +++++++
Регистрация: 28.10.2006
aEremenko: Доступность appl.globalCache() для всех сессий DAX
Источник: http://blogs.msdn.com/aeremenk/archi...7/2162015.aspx
==============

С любезного разрешения моего коллеги Григория Верного, публикую этот текст и файл экспорта.

Q: Есть ли возможность доступа к appl.globalCache() для каждой сессии DAX или каждая сессия имеет свой globalcache()?
A: Каждая сессия создает два экземпляра globalChache(): Infolog.globalCache() и Appl.globalCache().
Эти экземпляры независимы и не имеют доступа к данным друг друга. Это означает, что при добавлении объекта в infolog.globalCache(), к нему нет доступа из appl.globalCache().
Tip: Также важно, что запросы RPC к globalCache с клиента на сервер, или наоборот, порождают безумное количество запросов по перадаче данных (мне очень нравится английский термин – chattiness).
Следующий код дает возможность обращаться только к "своему" кэшу и избежать увеличения трафика обмена между клиентом и сервером.
X++:
SysGlobalCache cache; 
if(Global::IsRunningOnServer()) 
{ 
     cache = appl.globalCache(); 
} 
else 
{ 
     cache = infolog.globalCache(); 
}
Почему же не использовать classFactory() для замены такой конструкции?
Следующий пример делает практически тоже самое: 2 независимых кэша, созданных с помощью classFactory на клиенте и сервере. Прилагаемый файл содержит экспорт данного кода. Пример показывает, что classFactory не использует кэши infolog и appl повторно.

X++:
class GlobalCacheTest 
{ 
public void printCaches() 
{ 
    print "Appl              ", appl.globalCache().isSet("Appl", null); // expected true – no surprise here 
    print "Infolog           ", infolog.globalCache().isSet("Infolog", null); // expected true – no surprise here 
    print "CF_Server         ", classfactory.globalCache().isSet("ClassFactory_Server", null); 
    print "CF_Client         ", classfactory.globalCache().isSet("ClassFactory_Client", null); 
    print ""; 
    print "CF_Server_Appl    ", classfactory.globalCache().isSet("Appl", null); // this is to verify if classFactory re-uses appl's cache or not 
    print "CF_Client_Infolog ", classfactory.globalCache().isSet("Infolog", null); // this is to verify if classFactory re-uses infolog's cache or not 
} 
   
client server static void addAppl() // actually no matter from where we insert into appl's cache – it's always on Server side 
{ 
    ; 
    appl.globalCache().set("Appl", null, "Added from " + funcName()); 
} 
client server static void addInfolog() // actually no matter from where we insert into infolog's cache – it's always on Client side 
{ 
    ; 
    infolog.globalCache().set("Infolog", null, "Added from " + funcName()); 
} 
client static void addClassFactory_Client() 
{ 
    ; 
    classfactory.globalCache().set("ClassFactory_Client", null, "Added from " + funcName()); 
} 
server static void addClassFactory_Server() 
{ 
    ; 
    classfactory.globalCache().set("ClassFactory_Server", null, "Added from " + funcName()); 
} 
client static void print_Client() 
{ 
    print " === Client: ==="; 
   
    new GlobalCacheTest().printCaches(); 
   
} 
server static void print_Server() 
{ 
    print " === Server: ==="; 
   
    new GlobalCacheTest().printCaches(); 
} 
public static void main(Args _args) 
{ 
    ; 
    GlobalCacheTest::addAppl(); 
    GlobalCacheTest::addInfolog(); 
    GlobalCacheTest::addClassFactory_Client(); 
    GlobalCacheTest::addClassFactory_Server(); 
   
    GlobalCacheTest::print_Client(); 
    GlobalCacheTest::print_Server(); 
   
    pause; 
} 
}
Заключение: поскольку создаются 2 экземпляра classFactory с независимыми кэшами, как равноценную замену можно использовать следующий код (см. Inside Dynamics AX, глава 15):
Оригинал
Эквивалент
X++:
if(Global::IsRunningOnServer()) 
{ 
    cache = appl.globalCache(); 
} 
else 
{ 
    cache = infolog.globalCache(); 
}
cache = classFactory.globalCache()


Источник: http://blogs.msdn.com/aeremenk/archi...7/2162015.aspx
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
aEremenko: DAX 2009, работа с несколькими компаниями Blog bot DAX Blogs 8 28.10.2010 14:43
Как получить метки всех элементов всех форм (DAX 4) Qaz Qwerty DAX: Программирование 1 09.08.2008 05:39
aEremenko: Поддержка портала в DAX 4.0 на 64 бит Blog bot DAX Blogs 2 21.04.2008 18:13
aEremenko: Тестирование производительности в DAX 4.0 Blog bot DAX Blogs 0 12.03.2008 16:05
aEremenko: Как сопоставить пользователя DAX и сессию в Microsoft SQL? Blog bot DAX Blogs 2 04.10.2007 20:08
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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