17.04.2007, 18:01 | #1 |
Участник
|
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(); } Следующий пример делает практически тоже самое: 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; } } Оригинал Эквивалент 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, напишите личное сообщение администратору. |
|
|
|